【Python】快速认识Pandas的10大索引
公眾號(hào):尤而小屋
作者:Peter
編輯:Peter
今天給大家?guī)?lái)一篇關(guān)于Pandas索引的文章:10種你必須掌握的Pandas索引。
索引在我們的日常生活中其實(shí)是很常見(jiàn)的,就像:
一本書(shū)有自己的目錄和具體的章節(jié),當(dāng)我們想找某個(gè)知識(shí)點(diǎn),翻到對(duì)應(yīng)的章節(jié)即可;
也像圖書(shū)館中的書(shū)籍被分類(lèi)成文史類(lèi)、技術(shù)類(lèi)、小說(shuō)類(lèi)等,再加上書(shū)籍的編號(hào),很快就能夠找到我們想要的書(shū)籍。
外出吃飯點(diǎn)菜的菜單,從主食類(lèi)、飲料/湯類(lèi)、涼菜類(lèi)等,到具體的菜名等,點(diǎn)個(gè)菜即可。
上面不同的場(chǎng)景都可以看做是一個(gè)具體的索引應(yīng)用:通過(guò)索引我們能夠快速定位數(shù)據(jù)。
因此,基于實(shí)際需求出發(fā)創(chuàng)建的索引對(duì)我們的業(yè)務(wù)工作具有很強(qiáng)的指導(dǎo)意義。在Pandas中創(chuàng)建合適的索引則能夠方便我們的數(shù)據(jù)處理工作。
官網(wǎng)學(xué)習(xí)地址:https://pandas.pydata.org/docs/reference/api/pandas.Index.html
下面通過(guò)實(shí)際案例來(lái)介紹Pandas中常見(jiàn)的10種索引,以及如何創(chuàng)建它們。
pd.Index
Index是Pandas中的常見(jiàn)索引函數(shù),通過(guò)它能夠構(gòu)建各種類(lèi)型的索引,其語(yǔ)法為:
pandas.Index(data=None,?#?一維數(shù)組或者類(lèi)似數(shù)組結(jié)構(gòu)的數(shù)據(jù)dtype=None,??# NumPy數(shù)據(jù)類(lèi)型(默認(rèn)值:對(duì)象)copy=False,??#?是否生成副本name=None,?#??索引名字tupleize_cols=True,??#?如果為T(mén)rue,則盡可能?chē)L試創(chuàng)建?MultiIndex**kwargs )導(dǎo)入兩個(gè)必需的庫(kù):
import?pandas?as?pd import?numpy?as?np默認(rèn)的數(shù)據(jù)類(lèi)型是int64
In [2]:
#?通過(guò)列表來(lái)創(chuàng)建 pd.Index([1,2,3,4])Out[2]:
Int64Index([1,?2,?3,?4],?dtype='int64')在創(chuàng)建的時(shí)候,還能夠直接指定數(shù)據(jù)類(lèi)型:
In [3]:
#?指定索引的數(shù)據(jù)類(lèi)型 pd.Index([1,2,3,4],?dtype="float64")Out[3]:
Float64Index([1.0,?2.0,?3.0,?4.0],?dtype='float64')在創(chuàng)建的時(shí)候指定名稱(chēng)name和數(shù)據(jù)類(lèi)型dtype:
In [4]:
#?指定類(lèi)型和名稱(chēng) pd.Index([1,2,3,4],?dtype="float64",name="Peter")Out[4]:
Float64Index([1.0,?2.0,?3.0,?4.0],?dtype='float64',?name='Peter')In [5]:
#?使用list函數(shù)生成列表來(lái)創(chuàng)建 pd.Index(list("ABCD"))Out[5]:
Index(['A',?'B',?'C',?'D'],?dtype='object')使用元組來(lái)進(jìn)行創(chuàng)建:
In [6]:
#?使用元組來(lái)創(chuàng)建 pd.Index(("a","b","c","d"))Out[6]:
Index(['a',?'b',?'c',?'d'],?dtype='object')使用集合來(lái)進(jìn)行創(chuàng)建。集合本身是無(wú)序的,所以最終的結(jié)果并不一定是按照給定的元素順序:
In [7]:
#?使用集合來(lái)創(chuàng)建,集合本身是無(wú)序的 pd.Index({"x","y","z"})Out[7]:
Index(['z',?'x',?'y'],?dtype='object')pd.RangeIndex
生成一個(gè)區(qū)間內(nèi)的索引,主要是基于Python的range函數(shù),其語(yǔ)法為:
pandas.RangeIndex(start=None,??#?起始值,默認(rèn)為0stop=None,??#?終止值step=None,??#?步長(zhǎng),默認(rèn)為1dtype=None,??#?類(lèi)型copy=False,??#?是否生成副本name=None)??#?名稱(chēng)下面通過(guò)多個(gè)例子來(lái)講解:
In [8]:
pd.RangeIndex(8)??#?默認(rèn)start是0,步長(zhǎng)是1默認(rèn)結(jié)果中起始值是0,結(jié)束值是8(不包含),步長(zhǎng)是1:
Out[8]:
RangeIndex(start=0,?stop=8,?step=1)In [9]:
pd.RangeIndex(0,8)??#?指定start和stopOut[9]:
RangeIndex(start=0,?stop=8,?step=1)改變步長(zhǎng)為2:
In [10]:
pd.RangeIndex(0,8,2)Out[10]:
RangeIndex(start=0,?stop=8,?step=2)In [11]:
list(pd.RangeIndex(0,8,2))將結(jié)果用list顯示出來(lái),沒(méi)有包含stop的值8:
Out[11]:
[0,?2,?4,?6]下面的案例中將步長(zhǎng)改成-1:
In [12]:
pd.RangeIndex(8,0,-1)Out[12]:
RangeIndex(start=8,?stop=0,?step=-1)In [13]:
list(pd.RangeIndex(8,0,-1))Out[13]:
[8,?7,?6,?5,?4,?3,?2,?1]??#?結(jié)果中不包含0pd.Int64Index
指定數(shù)據(jù)類(lèi)型是int64整型
pandas.Int64Index(data=None,??#?生成索引的數(shù)據(jù)dtype=None,??#?索引類(lèi)型,默認(rèn)是int64copy=False,??#?是否生成副本name=None)??#?使用名稱(chēng)In [14]:
pd.Int64Index([1,2,3,4])Out[14]:
Int64Index([1,?2,?3,?4],?dtype='int64')In [15]:
pd.Int64Index([1,2.0,3,4])??#?強(qiáng)制轉(zhuǎn)成int64類(lèi)型Out[15]:
Int64Index([1,?2,?3,?4],?dtype='int64')In [16]:
pd.Int64Index([1,2,3,4],name="Peter")Out[16]:
Int64Index([1,?2,?3,?4],?dtype='int64',?name='Peter')如果在數(shù)據(jù)中包含小數(shù)則會(huì)報(bào)錯(cuò):
In [17]:
#?pd.Int64Index([1,2,3,4.4])??#?出現(xiàn)小數(shù)則報(bào)錯(cuò)pd.UInt64Index
數(shù)據(jù)類(lèi)型是無(wú)符號(hào)的UInt64
pandas.UInt64Index(data=None,?dtype=None,?copy=False,?name=None )In [18]:
pd.UInt64Index([1,?2,?3,?4])Out[18]:
UInt64Index([1,?2,?3,?4],?dtype='uint64')In [19]:
pd.UInt64Index([1,?2,?3,?4],name="Tom")??#?指定名字Out[19]:
UInt64Index([1,?2,?3,?4],?dtype='uint64',?name='Tom')In [20]:
pd.UInt64Index([1,?2.0,?3,?4],name="Tom")Out[20]:
UInt64Index([1,?2,?3,?4],?dtype='uint64',?name='Tom')#?存在小數(shù)則報(bào)錯(cuò) pd.UInt64Index([1,?2.4,?3,?4],name="Tom")pd.Float64Index
數(shù)據(jù)類(lèi)型是Float64位的浮點(diǎn)型,允許小數(shù)出現(xiàn):
pandas.Float64Index(data=None,??#?數(shù)據(jù)dtype=None,??#?類(lèi)型copy=False,??#?是否生成副本name=None??#?索引名字 )In [22]:
pd.Float64Index([1,?2,?3,?4])Out[22]:
Float64Index([1.0,?2.0,?3.0,?4.0],?dtype='float64')In [23]:
pd.Float64Index([1.5,?2.4,?3.7,?4.9])Out[23]:
Float64Index([1.5,?2.4,?3.7,?4.9],?dtype='float64')In [24]:
pd.Float64Index([1.5,?2.4,?3.7,?4.9],name="peter")Out[24]:
Float64Index([1.5,?2.4,?3.7,?4.9],?dtype='float64',?name='peter')注意:在Pandas1.4.0的版本中,上面3個(gè)函數(shù)全部統(tǒng)一成了pd.NumericIndex方法。
pd.IntervalIndex
pd.IntervalIndex(data,??#?待生成索引的數(shù)據(jù)(一維)closed=None,??#?區(qū)間的哪邊是關(guān)閉狀態(tài),{‘left’,?‘right’,?‘both’,?‘neither’},?default?‘right’dtype=None,??#?數(shù)據(jù)類(lèi)型copy=False,??#??生成副本name=None,??#?索引的名字verify_integrity=True??#?判斷是否符合 )新的 IntervalIndex 通常使用interval_range()函數(shù)來(lái)進(jìn)行構(gòu)造,基本用法:
In [24]:
pd.interval_range(start=0,?end=6)Out[24]:
IntervalIndex([(0,?1],?(1,?2],?(2,?3],?(3,?4],?(4,?5],?(5,?6]],closed='right',??#?默認(rèn)情況下右邊是關(guān)閉的dtype='interval[int64]')In [25]:
pd.interval_range(start=0,?end=6,?closed="neither")??#?兩邊都不關(guān)閉Out[25]:
IntervalIndex([(0,?1),?(1,?2),?(2,?3),?(3,?4),?(4,?5),?(5,?6)],closed='neither',dtype='interval[int64]')In [26]:
pd.interval_range(start=0,?end=6,?closed="both")??#?兩邊都關(guān)閉Out[26]:
IntervalIndex([[0,?1],?[1,?2],?[2,?3],?[3,?4],?[4,?5],?[5,?6]],closed='both',dtype='interval[int64]')In [27]:
pd.interval_range(start=0,?end=6,?closed="left")??#?左邊關(guān)閉Out[27]:
IntervalIndex([[0,?1),?[1,?2),?[2,?3),?[3,?4),?[4,?5),?[5,?6)],closed='left',dtype='interval[int64]')In [28]:
pd.interval_range(start=0,?end=6,?name="peter")Out[28]:
IntervalIndex([(0,?1],?(1,?2],?(2,?3],?(3,?4],?(4,?5],?(5,?6]],closed='right',name='peter',dtype='interval[int64]')pd.CategoricalIndex
pandas.CategoricalIndex(data=None,???#?數(shù)據(jù)categories=None,??#?分類(lèi)的數(shù)據(jù)ordered=None,??#?是否排序dtype=None,???#?數(shù)據(jù)類(lèi)型copy=False,???#?副本name=None)??#?名字在下面的例子中我們以一批衣服的尺碼作為模擬數(shù)據(jù):
In [29]:
#?指定數(shù)據(jù) c1?=?pd.CategoricalIndex(["S","M","L","XS","M","L","S","M","L","XL"]) c1Out[29]:
CategoricalIndex(#?數(shù)據(jù)['S',?'M',?'L',?'XS',?'M',?'L',?'S',?'M',?'L',?'XL'],?#?出現(xiàn)的不同元素categories=['L',?'M',?'S',?'XL',?'XS'],??#?默認(rèn)不排序?ordered=False,#?數(shù)據(jù)類(lèi)型dtype='category')In [30]:
c2?=?pd.CategoricalIndex(["S","M","L","XS","M","L","S","M","L","XL"],#?指定分類(lèi)的數(shù)據(jù)categories=["XS","S","M","L","XL"] )c2Out[30]:
CategoricalIndex(['S',?'M',?'L',?'XS',?'M',?'L',?'S',?'M',?'L',?'XL'],?categories=['XS',?'S',?'M',?'L',?'XL'],?ordered=False,?dtype='category')In [31]:
c3?=?pd.CategoricalIndex(#?數(shù)據(jù)["S","M","L","XS","M","L","S","M","L","XL"],#?分類(lèi)名字categories=["XS","S","M","L","XL"],#?確定排序ordered=True )c3Out[31]:
CategoricalIndex(['S',?'M',?'L',?'XS',?'M',?'L',?'S',?'M',?'L',?'XL'],?categories=['XS',?'S',?'M',?'L',?'XL'],?ordered=True,??#?已經(jīng)排序dtype='category')In [32]:
c4?=?pd.CategoricalIndex(#?待排序的數(shù)據(jù)["S","M","L","XS","M","L","S","M","L","XL"],#?指定分類(lèi)順序categories=["XS","S","M","L","XL"],#?排序ordered=True,#?索引名字name="category" )c4Out[32]:
CategoricalIndex(['S',?'M',?'L',?'XS',?'M',?'L',?'S',?'M',?'L',?'XL'],?categories=['XS',?'S',?'M',?'L',?'XL'],?ordered=True,?name='category',?dtype='category')CategoricalIndex 索引對(duì)象也可以從 Categorical() 方法進(jìn)行實(shí)例化得到:
In [33]:
c5?=?pd.Categorical(["a",?"b",?"c",?"c",?"b",?"c",?"a"])pd.CategoricalIndex(c5)Out[33]:
CategoricalIndex(['a',?'b',?'c',?'c',?'b',?'c',?'a'],?categories=['a',?'b',?'c'],?ordered=False,??#?默認(rèn)不排序dtype='category')In [34]:
pd.CategoricalIndex(c5,?ordered=True)??#?指定排序Out[34]:
CategoricalIndex(['a',?'b',?'c',?'c',?'b',?'c',?'a'],?categories=['a',?'b',?'c'],?ordered=True,?#?排序dtype='category')pd.DatetimeIndex
以時(shí)間和日期作為索引,通過(guò)date_range函數(shù)來(lái)生成,具體語(yǔ)法為:
pd.DatetimeIndex(data=None,??#?數(shù)據(jù)freq=NoDefault.no_default,??#?頻率tz=None,??#??時(shí)區(qū)normalize=False,??#?是否歸一化?closed=None,??#?區(qū)間是否關(guān)閉#?‘infer’,?bool-ndarray,?‘NaT’,?默認(rèn)‘raise’ambiguous='raise',??dayfirst=False,??#?第一天yearfirst=False,??#?第一年dtype=None,??#?數(shù)據(jù)類(lèi)型copy=False,??#?副本name=None??#?名字 )以時(shí)間和日期作為索引,通過(guò)date_range函數(shù)來(lái)生成,具體例子為:
In [35]:
#?默認(rèn)天為頻率 pd.date_range("2022-01-01",periods=6)Out[35]:
DatetimeIndex(['2022-01-01',?'2022-01-02',?'2022-01-03',?'2022-01-04','2022-01-05',?'2022-01-06'],dtype='datetime64[ns]',?freq='D'??#?頻率)In [36]:
#?日期作為索引,D代表天 d1?=?pd.date_range( "2022-01-01", periods=6,? freq="D") d1Out[36]:
DatetimeIndex(['2022-01-01',?'2022-01-02',?'2022-01-03',?'2022-01-04','2022-01-05',?'2022-01-06'],dtype='datetime64[ns]',?freq='D')In [37]:
#?H代表小時(shí) pd.date_range("2022-01-01",periods=6,?freq="H")Out[37]:
DatetimeIndex(['2022-01-01?00:00:00',?'2022-01-01?01:00:00','2022-01-01?02:00:00',?'2022-01-01?03:00:00','2022-01-01?04:00:00',?'2022-01-01?05:00:00'],dtype='datetime64[ns]',?freq='H')In [38]:
#?M代表月 pd.date_range("2022-01-01",periods=6,?freq="3M")Out[38]:
DatetimeIndex(['2022-01-31',?'2022-04-30',?'2022-07-31','2022-10-31','2023-01-31',?'2023-04-30'],dtype='datetime64[ns]',?freq='3M')In [39]:
#?Q代表季度pd.date_range("2022-01-01",periods=6,?freq="Q")顯示的結(jié)果中以一個(gè)季度-3個(gè)月為頻率:
Out[39]:
DatetimeIndex(['2022-03-31',?'2022-06-30',?'2022-09-30','2022-12-31','2023-03-31',?'2023-06-30'],dtype='datetime64[ns]',?freq='Q-DEC')In [40]:
#?指定時(shí)區(qū)tzpd.date_range("2022-01-01",periods=6,?tz="Asia/Calcutta")Out[40]:
DatetimeIndex(['2022-01-01?00:00:00+05:30',?'2022-01-02?00:00:00+05:30','2022-01-03?00:00:00+05:30',?'2022-01-04?00:00:00+05:30','2022-01-05?00:00:00+05:30',?'2022-01-06?00:00:00+05:30'],dtype='datetime64[ns,?Asia/Calcutta]',?freq='D')pd.PeriodIndex
pd.PeriodIndex是一個(gè)專(zhuān)門(mén)針對(duì)周期性數(shù)據(jù)的索引,方便針對(duì)具有一定周期的數(shù)據(jù)進(jìn)行處理,具體用法如下:
pd.PeriodIndex(data=None,??#?數(shù)據(jù)ordinal=None,??#?序數(shù)freq=None,??#?頻率dtype=None,??#?數(shù)據(jù)類(lèi)型copy=False,??#?副本name=None,??#?名字**fields )生成pd.PeriodIndex對(duì)象的方式1:指定開(kāi)始時(shí)間、周期頻率
In [41]:
pd.period_range('2022-01-01?09:00',?periods=5,?freq='H')Out[41]:
PeriodIndex( ['2022-01-01?09:00',?'2022-01-01?10:00',? '2022-01-01?11:00','2022-01-01?12:00',?'2022-01-01?13:00'], dtype='period[H]',?freq='H')In [42]:
pd.period_range('2022-01-01?09:00',?periods=6,?freq='2D')Out[42]:
PeriodIndex( ['2022-01-01',?'2022-01-03',? '2022-01-05',?'2022-01-07', '2022-01-09',?'2022-01-11'], dtype='period[2D]',? freq='2D')In [43]:
pd.period_range('2022-01',?periods=5,?freq='M')Out[43]:
PeriodIndex( ['2022-01',?'2022-02',? '2022-03',?'2022-04',?'2022-05'],? dtype='period[M]',?freq='M')In [44]:
p1?=?pd.DataFrame({"name":["xiaoming","xiaohong","Peter","Mike","Jimmy"]},#?指定索引index=pd.period_range('2022-01-01?09:00',?periods=5,?freq='3H') )p1生成pd.PeriodIndex對(duì)象的方式2:直接使用pd.PeriodIndex方法
In [45]:
pd.PeriodIndex( ['2022-01-01',?'2022-01-02',? '2022-01-03',?'2022-01-04'],? freq?=?'2H')Out[45]:
PeriodIndex( ['2022-01-01?00:00',?'2022-01-02?00:00',? '2022-01-03?00:00','2022-01-04?00:00'], dtype='period[2H]',?freq='2H')In [46]:
pd.PeriodIndex( ['2022-01',?'2022-02',? '2022-03',?'2022-04'],? freq?=?'M')Out[46]:
PeriodIndex( ['2022-01',?'2022-02',? '2022-03',?'2022-04'],? dtype='period[M]',? freq='M')In [47]:
pd.PeriodIndex(['2022-01',?'2022-07'],?freq?=?'Q')Out[47]:
PeriodIndex( ['2022Q1',?'2022Q3'],? dtype='period[Q-DEC]',? freq='Q-DEC')生成pd.PeriodIndex對(duì)象的方式3:利用date_range函數(shù)先生成DatetimeIndex對(duì)象
In [48]:
data?=?pd.date_range("2022-01-01",periods=6) dataOut[48]:
DatetimeIndex( ['2022-01-01',?'2022-01-02',? '2022-01-03',?'2022-01-04', '2022-01-05',?'2022-01-06'], dtype='datetime64[ns]',? freq='D')In [49]:
pd.PeriodIndex(data=data)Out[49]:
PeriodIndex( ['2022-01-01',?'2022-01-02',? '2022-01-03',?'2022-01-04', '2022-01-05',?'2022-01-06'], dtype='period[D]',?freq='D')In [50]:
p2?=?pd.DataFrame(np.random.randn(400,?1),columns=['number'],#?指定索引index=pd.period_range('2021-01-01?8:00',periods=400,freq='D')) p2pd.TimedeltaIndex
pd.TimedeltaIndex(data=None,??#?數(shù)據(jù)unit=None,??#?最小單元freq=NoDefault.no_default,??#?頻率?closed=None,??#?指定關(guān)閉的位置dtype=dtype('<m8[ns]'),??#?數(shù)據(jù)類(lèi)型copy=False,??#?副本name=None??#?名字 )創(chuàng)建方式1:指定數(shù)據(jù)和最小單元
In [51]:
pd.TimedeltaIndex([12,?24,?36,?48],?unit='s')Out[51]:
TimedeltaIndex(['0?days?00:00:12',?'0?days?00:00:24',?'0?days?00:00:36','0?days?00:00:48'],dtype='timedelta64[ns]',?freq=None)In [52]:
pd.TimedeltaIndex([1,?2,?3,?4],?unit='h')?#?按小時(shí)Out[52]:
TimedeltaIndex(['0?days?01:00:00',?'0?days?02:00:00',?'0?days?03:00:00','0?days?04:00:00'],dtype='timedelta64[ns]',?freq=None)In [53]:
pd.TimedeltaIndex([12,?24,?36,?48],?unit='h')Out[53]:
TimedeltaIndex(['0?days?12:00:00',?'1?days?00:00:00',?'1?days?12:00:00','2?days?00:00:00'],dtype='timedelta64[ns]',?#?數(shù)據(jù)類(lèi)型freq=None)In [54]:
pd.TimedeltaIndex([12,?24,?36,?48],?unit='D')Out[54]:
TimedeltaIndex(['12?days',?'24?days',?'36?days',?'48?days'],?dtype='timedelta64[ns]',?freq=None)創(chuàng)建方式2:通過(guò)timedelta_range函數(shù)來(lái)間接生成
In [55]:
data1?=?pd.timedelta_range(start='1?day',?periods=4) data1Out[55]:
TimedeltaIndex(['1?days',?'2?days',?'3?days',?'4?days'],?dtype='timedelta64[ns]',?freq='D')In [56]:
pt1?=?pd.TimedeltaIndex(data1)pt1Out[56]:
TimedeltaIndex(['1?days',?'2?days',?'3?days',?'4?days'],?dtype='timedelta64[ns]',?freq='D')In [57]:
data2?=?pd.timedelta_range(start='1?day',?end='3?days',?freq='6H') data2Out[57]:
TimedeltaIndex(['1?days?00:00:00',?'1?days?06:00:00',?'1?days?12:00:00','1?days?18:00:00',?'2?days?00:00:00',?'2?days?06:00:00','2?days?12:00:00',?'2?days?18:00:00',?'3?days?00:00:00'],dtype='timedelta64[ns]',?freq='6H')In [58]:
pt2?=?pd.TimedeltaIndex(data2)pt2Out[58]:
往期精彩回顧適合初學(xué)者入門(mén)人工智能的路線及資料下載(圖文+視頻)機(jī)器學(xué)習(xí)入門(mén)系列下載中國(guó)大學(xué)慕課《機(jī)器學(xué)習(xí)》(黃海廣主講)機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專(zhuān)輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請(qǐng)掃碼: 與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的【Python】快速认识Pandas的10大索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java访问同一个变量_java – 从
- 下一篇: Java包装类中的equals方法