【Python】快速认识Pandas的10大索引
公眾號:尤而小屋
作者:Peter
編輯:Peter
今天給大家帶來一篇關于Pandas索引的文章:10種你必須掌握的Pandas索引。
索引在我們的日常生活中其實是很常見的,就像:
一本書有自己的目錄和具體的章節,當我們想找某個知識點,翻到對應的章節即可;
也像圖書館中的書籍被分類成文史類、技術類、小說類等,再加上書籍的編號,很快就能夠找到我們想要的書籍。
外出吃飯點菜的菜單,從主食類、飲料/湯類、涼菜類等,到具體的菜名等,點個菜即可。
上面不同的場景都可以看做是一個具體的索引應用:通過索引我們能夠快速定位數據。
因此,基于實際需求出發創建的索引對我們的業務工作具有很強的指導意義。在Pandas中創建合適的索引則能夠方便我們的數據處理工作。
官網學習地址:https://pandas.pydata.org/docs/reference/api/pandas.Index.html
下面通過實際案例來介紹Pandas中常見的10種索引,以及如何創建它們。
pd.Index
Index是Pandas中的常見索引函數,通過它能夠構建各種類型的索引,其語法為:
pandas.Index(data=None,?#?一維數組或者類似數組結構的數據dtype=None,??# NumPy數據類型(默認值:對象)copy=False,??#?是否生成副本name=None,?#??索引名字tupleize_cols=True,??#?如果為True,則盡可能嘗試創建?MultiIndex**kwargs )導入兩個必需的庫:
import?pandas?as?pd import?numpy?as?np默認的數據類型是int64
In [2]:
#?通過列表來創建 pd.Index([1,2,3,4])Out[2]:
Int64Index([1,?2,?3,?4],?dtype='int64')在創建的時候,還能夠直接指定數據類型:
In [3]:
#?指定索引的數據類型 pd.Index([1,2,3,4],?dtype="float64")Out[3]:
Float64Index([1.0,?2.0,?3.0,?4.0],?dtype='float64')在創建的時候指定名稱name和數據類型dtype:
In [4]:
#?指定類型和名稱 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函數生成列表來創建 pd.Index(list("ABCD"))Out[5]:
Index(['A',?'B',?'C',?'D'],?dtype='object')使用元組來進行創建:
In [6]:
#?使用元組來創建 pd.Index(("a","b","c","d"))Out[6]:
Index(['a',?'b',?'c',?'d'],?dtype='object')使用集合來進行創建。集合本身是無序的,所以最終的結果并不一定是按照給定的元素順序:
In [7]:
#?使用集合來創建,集合本身是無序的 pd.Index({"x","y","z"})Out[7]:
Index(['z',?'x',?'y'],?dtype='object')pd.RangeIndex
生成一個區間內的索引,主要是基于Python的range函數,其語法為:
pandas.RangeIndex(start=None,??#?起始值,默認為0stop=None,??#?終止值step=None,??#?步長,默認為1dtype=None,??#?類型copy=False,??#?是否生成副本name=None)??#?名稱下面通過多個例子來講解:
In [8]:
pd.RangeIndex(8)??#?默認start是0,步長是1默認結果中起始值是0,結束值是8(不包含),步長是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)改變步長為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))將結果用list顯示出來,沒有包含stop的值8:
Out[11]:
[0,?2,?4,?6]下面的案例中將步長改成-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]??#?結果中不包含0pd.Int64Index
指定數據類型是int64整型
pandas.Int64Index(data=None,??#?生成索引的數據dtype=None,??#?索引類型,默認是int64copy=False,??#?是否生成副本name=None)??#?使用名稱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])??#?強制轉成int64類型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')如果在數據中包含小數則會報錯:
In [17]:
#?pd.Int64Index([1,2,3,4.4])??#?出現小數則報錯pd.UInt64Index
數據類型是無符號的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')#?存在小數則報錯 pd.UInt64Index([1,?2.4,?3,?4],name="Tom")pd.Float64Index
數據類型是Float64位的浮點型,允許小數出現:
pandas.Float64Index(data=None,??#?數據dtype=None,??#?類型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個函數全部統一成了pd.NumericIndex方法。
pd.IntervalIndex
pd.IntervalIndex(data,??#?待生成索引的數據(一維)closed=None,??#?區間的哪邊是關閉狀態,{‘left’,?‘right’,?‘both’,?‘neither’},?default?‘right’dtype=None,??#?數據類型copy=False,??#??生成副本name=None,??#?索引的名字verify_integrity=True??#?判斷是否符合 )新的 IntervalIndex 通常使用interval_range()函數來進行構造,基本用法:
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',??#?默認情況下右邊是關閉的dtype='interval[int64]')In [25]:
pd.interval_range(start=0,?end=6,?closed="neither")??#?兩邊都不關閉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")??#?兩邊都關閉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")??#?左邊關閉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,???#?數據categories=None,??#?分類的數據ordered=None,??#?是否排序dtype=None,???#?數據類型copy=False,???#?副本name=None)??#?名字在下面的例子中我們以一批衣服的尺碼作為模擬數據:
In [29]:
#?指定數據 c1?=?pd.CategoricalIndex(["S","M","L","XS","M","L","S","M","L","XL"]) c1Out[29]:
CategoricalIndex(#?數據['S',?'M',?'L',?'XS',?'M',?'L',?'S',?'M',?'L',?'XL'],?#?出現的不同元素categories=['L',?'M',?'S',?'XL',?'XS'],??#?默認不排序?ordered=False,#?數據類型dtype='category')In [30]:
c2?=?pd.CategoricalIndex(["S","M","L","XS","M","L","S","M","L","XL"],#?指定分類的數據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(#?數據["S","M","L","XS","M","L","S","M","L","XL"],#?分類名字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,??#?已經排序dtype='category')In [32]:
c4?=?pd.CategoricalIndex(#?待排序的數據["S","M","L","XS","M","L","S","M","L","XL"],#?指定分類順序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 索引對象也可以從 Categorical() 方法進行實例化得到:
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,??#?默認不排序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
以時間和日期作為索引,通過date_range函數來生成,具體語法為:
pd.DatetimeIndex(data=None,??#?數據freq=NoDefault.no_default,??#?頻率tz=None,??#??時區normalize=False,??#?是否歸一化?closed=None,??#?區間是否關閉#?‘infer’,?bool-ndarray,?‘NaT’,?默認‘raise’ambiguous='raise',??dayfirst=False,??#?第一天yearfirst=False,??#?第一年dtype=None,??#?數據類型copy=False,??#?副本name=None??#?名字 )以時間和日期作為索引,通過date_range函數來生成,具體例子為:
In [35]:
#?默認天為頻率 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代表小時 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")顯示的結果中以一個季度-3個月為頻率:
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]:
#?指定時區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是一個專門針對周期性數據的索引,方便針對具有一定周期的數據進行處理,具體用法如下:
pd.PeriodIndex(data=None,??#?數據ordinal=None,??#?序數freq=None,??#?頻率dtype=None,??#?數據類型copy=False,??#?副本name=None,??#?名字**fields )生成pd.PeriodIndex對象的方式1:指定開始時間、周期頻率
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對象的方式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對象的方式3:利用date_range函數先生成DatetimeIndex對象
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,??#?數據unit=None,??#?最小單元freq=NoDefault.no_default,??#?頻率?closed=None,??#?指定關閉的位置dtype=dtype('<m8[ns]'),??#?數據類型copy=False,??#?副本name=None??#?名字 )創建方式1:指定數據和最小單元
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')?#?按小時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]',?#?數據類型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)創建方式2:通過timedelta_range函數來間接生成
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]:
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼: 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【Python】快速认识Pandas的10大索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java访问同一个变量_java – 从
- 下一篇: 【Python】面向小白的Python可