pandas庫(kù)之loc與iloc

對(duì)于DataFrame的行的標(biāo)簽索引,我引入了特殊的標(biāo)簽運(yùn)算符loc和iloc。它們可以讓你用類(lèi)似NumPy的標(biāo)記,使用軸標(biāo)簽(loc)或整數(shù)索引(iloc),從DataFrame選擇行和列的子集。
首先,創(chuàng)建一個(gè)DataFrame,我們繼續(xù)沿用之前的data:

In [128]: data = pd.DataFrame(np.arange(16).reshape((4, 4)),
   .....:                     index=['Ohio', 'Colorado', 'Utah', 'New York'],
   .....:                     columns=['one', 'two', 'three', 'four'])

In [129]: data
Out[129]: 
          one  two  three  four
Ohio        0    1      2     3
Colorado    4    5      6     7
Utah        8    9     10    11
New York   12   13     14    15

作為一個(gè)初步示例,讓我們通過(guò)標(biāo)簽選擇一行和多列:

In [137]: data.loc['Colorado', ['two', 'three']]
Out[137]: 
two      5
three    6
Name: Colorado, dtype: int64

然后用iloc和整數(shù)進(jìn)行選?。?/p>

In [138]: data.iloc[2, [3, 0, 1]]
Out[138]: 
four    11
one      8
two      9
Name: Utah, dtype: int64

In [139]: data.iloc[2]
Out[139]: 
one       8
two       9
three    10
four     11
Name: Utah, dtype: int64

In [140]: data.iloc[[1, 2], [3, 0, 1]]
Out[140]: 
          four  one  two
Colorado     7    0    5
Utah        11    8    9

可以看到這兩個(gè)操作都是先行后列的順序。
iloc相比于loc主要是采取了整數(shù)的形式,i代表了int。

這兩個(gè)索引函數(shù)也適用于一個(gè)標(biāo)簽或多個(gè)標(biāo)簽的切片:

In [141]: data.loc[:'Utah', 'two']
Out[141]: 
Ohio        0
Colorado    5
Utah        9
Name: two, dtype: int64

In [142]: data.iloc[:, :3][data.three > 5]
Out[142]: 
          one  two  three
Colorado    0    5      6
Utah        8    9     10
New York   12   13     14

所以,在pandas中,有多個(gè)方法可以選取和重新組合數(shù)據(jù)。對(duì)于DataFrame,表5-4進(jìn)行了總結(jié)。后面會(huì)看到,還有更多的方法進(jìn)行層級(jí)化索引。

筆記:在一開(kāi)始設(shè)計(jì)pandas時(shí),我覺(jué)得用frame[:, col]選取列過(guò)于繁瑣(也容易出錯(cuò)),因?yàn)榱械倪x擇是非常常見(jiàn)的操作。我做了些取舍,將花式索引的功能(標(biāo)簽和整數(shù))放到了ix運(yùn)算符中。在實(shí)踐中,這會(huì)導(dǎo)致許多邊緣情況,數(shù)據(jù)的軸標(biāo)簽是整數(shù),所以pandas團(tuán)隊(duì)決定創(chuàng)造loc和iloc運(yùn)算符分別處理嚴(yán)格基于標(biāo)簽和整數(shù)的索引。
ix運(yùn)算符仍然可用,但并不推薦。

表5-4 DataFrame的索引選項(xiàng)

處理整數(shù)索引的pandas對(duì)象常常難住新手,因?yàn)樗cpython內(nèi)置的列表和元素的索引語(yǔ)法不同。例如,你可能不認(rèn)為下面的代碼會(huì)出錯(cuò):

ser = pd.Series(np.arange(3.))
ser
ser[-1]

這里,pandas可以勉強(qiáng)進(jìn)行整數(shù)索引,但是會(huì)導(dǎo)致小bug。我們有包含0,1,2的索引,但是引入用戶(hù)想要的東西(基于標(biāo)簽或位置的索引)很難:

In [144]: ser
Out[144]: 
0    0.0
1    1.0
2    2.0
dtype: float64

容易發(fā)生歧義,所以整數(shù)索引還是不推薦。

另外,對(duì)于非整數(shù)索引,不會(huì)產(chǎn)生歧義:

In [145]: ser2 = pd.Series(np.arange(3.), index=['a', 'b', 'c'])

In [146]: ser2[-1]
Out[146]: 2.0

為了進(jìn)行統(tǒng)一,如果軸索引含有整數(shù),數(shù)據(jù)選取總會(huì)使用標(biāo)簽。為了更準(zhǔn)確,請(qǐng)使用loc(標(biāo)簽)或iloc(整數(shù)):

In [147]: ser[:1]
Out[147]: 
0    0.0
dtype: float64

In [148]: ser.loc[:1]
Out[148]: 
0    0.0
1    1.0
dtype: float64

In [149]: ser.iloc[:1]
Out[149]: 
0    0.0
dtype: float64

文章代碼引用自:《利用Python進(jìn)行數(shù)據(jù)分析·第2版》第5章 Pandas入門(mén)
作者:SeanCheney
感謝SeanCheney同意引用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本節(jié)中,我將介紹操作Series和DataFrame中的數(shù)據(jù)的基本手段。后續(xù)章節(jié)將更加深入地挖掘pandas在數(shù)據(jù)...
    米小河123閱讀 748評(píng)論 0 1
  • 本章節(jié)以及后續(xù)章節(jié)的源碼,當(dāng)然也可以從我的github下載,在源碼中我自己加了一些中文注釋。 現(xiàn)在是晚上九點(diǎn)十五,...
    owolf閱讀 1,445評(píng)論 0 2
  • pandas入門(mén) 簡(jiǎn)介 pandas包含的數(shù)據(jù)結(jié)構(gòu)和操作工具能快速簡(jiǎn)單地清洗和分析數(shù)據(jù)。 pandas經(jīng)常與Num...
    python測(cè)試開(kāi)發(fā)閱讀 2,472評(píng)論 1 16
  • Pandas 目錄一、Pandas基礎(chǔ)二、Pandas三大數(shù)據(jù)結(jié)構(gòu)1.Series2.DataFrame3.Ind...
    Recalcitrant閱讀 2,191評(píng)論 0 11
  • 一,簡(jiǎn)介 通用鏈接是Apple在WWDC2015上為iOS9引入的一個(gè)新功能,是通過(guò)傳統(tǒng)HTTP鏈接來(lái)啟動(dòng)App的...
    崔可一閱讀 28,382評(píng)論 3 51

友情鏈接更多精彩內(nèi)容