對(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)算符仍然可用,但并不推薦。

處理整數(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同意引用。