Pandas DataFrame的loc、iloc、ix和at/iat淺析

前段時間看Think Python里面有句話記憶猶新,大概意思是:有時候Python讓我們感到困惑,是因為實現一個效果的方法太多,而不是太少。

確實如此,Pandas的DataFrame數據選取就存在這樣的問題。本來理解列表索引(了解列表索引請參考:一張圖弄懂python索引和切片)就已經很困難了,DataFrame還帶這么多方法。

廢話少說,直接上結果。

1、loc:通過標簽選取數據,即通過index和columns的值進行選取。loc方法有兩個參數,按順序控制行列選取。

#示例數據集
df=pd.DataFrame(np.arange(12).reshape(4,3),columns=list('abc'),index=list('defg'))

df
Out[189]: 
   a   b   c
d  0   1   2
e  3   4   5
f  6   7   8
g  9  10  11

#直接索引行
df.loc['d']
Out[190]: 
a    0
b    1
c    2
Name: d, dtype: int32

#索引多行
df.loc[['d','e']]
Out[191]: 
   a  b  c
d  0  1  2
e  3  4  5

#索引多列
df.loc[:,:'b']
Out[193]: 
   a   b
d  0   1
e  3   4
f  6   7
g  9  10

#如果索引的標簽不在index或columns范圍則會報錯,a標簽在列中,loc的第一個參數為行索引。
df.loc['a']
Traceback (most recent call last):
……
KeyError: 'the label [a] is not in the [index]'

2、iloc:通過行號選取數據,即通過數據所在的自然行列數為選取數據。iloc方法也有兩個參數,按順序控制行列選取。

注意:行號和索引有所差異,進行篩選后的數據行號會根據新的DataFrame變化,而索引不會發生變化。

df
Out[196]: 
   a   b   c
d  0   1   2
e  3   4   5
f  6   7   8
g  9  10  11

#選取一行
df.iloc[0]
Out[197]: 
a    0
b    1
c    2
Name: d, dtype: int32

#選取多行
df.iloc[0:2]
Out[198]: 
   a  b  c
d  0  1  2
e  3  4  5

#選取一列或多列
df.iloc[:,2:3]
Out[199]: 
    c
d   2
e   5
f   8
g  11

3、ix:混合索引,同時通過標簽和行號選取數據。ix方法也有兩個參數,按順序控制行列選取。

注意:ix的兩個參數中,每個參數在索引時必須保持只使用標簽或行號進行數據選取,否則會返回一部分控制結果。

df
Out[200]: 
   a   b   c
d  0   1   2
e  3   4   5
f  6   7   8
g  9  10  11

#選取一行
df.ix[1]
Out[201]: 
a    3
b    4
c    5
Name: e, dtype: int32

#錯誤的混合索引(想選取第一行和e行)
df.ix[[0,'e']]
Out[202]: 
     a    b    c
0  NaN  NaN  NaN
e  3.0  4.0  5.0

#選取區域(e行的前兩列)
df.ix['e':,:2]
Out[203]: 
   a   b
e  3   4
f  6   7
g  9  10

4、at/iat:通過標簽或行號獲取某個數值的具體位置。

df
Out[204]: 
   a   b   c
d  0   1   2
e  3   4   5
f  6   7   8
g  9  10  11

#獲取第2行,第3列位置的數據
df.iat[1,2]
Out[205]: 5

#獲取f行,a列位置的數據
df.at['f','a']
Out[206]: 6

5、直接索引 df[]

df
Out[208]: 
   a   b   c
d  0   1   2
e  3   4   5
f  6   7   8
g  9  10  11

#選取行
df[0:3]
Out[209]: 
   a  b  c
d  0  1  2
e  3  4  5
f  6  7  8

#選取列
df['a']
Out[210]: 
d    0
e    3
f    6
g    9
Name: a, dtype: int32

#選取多列
df[['a','c']]
Out[211]: 
   a   c
d  0   2
e  3   5
f  6   8
g  9  11

#行號和區間索引只能用于行(預想選取C列的數據,
#但這里選取除了df的所有數據,區間索引只能用于行,
#因defg均>c,所以所有行均被選取出來)
df['c':]
Out[212]: 
   a   b   c
d  0   1   2
e  3   4   5
f  6   7   8
g  9  10  11
df['f':]
Out[213]: 
   a   b   c
f  6   7   8
g  9  10  11

#df.選取列
df.a
Out[214]: 
d    0
e    3
f    6
g    9
Name: a, dtype: int32
#不能使用df.選擇行
df.f
Traceback (most recent call last):
  File "<ipython-input-215-6438703abe20>", line 1, in <module>
    df.f
  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 2744, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'f'

6、總結

1).loc,.iloc,.ix,只加第一個參數如.loc([1,2]),.iloc([2:3]),.ix[2]…則進行的是行選擇
2).loc,.at,選列是只能是列名,不能是position
3).iloc,.iat,選列是只能是position,不能是列名
4)df[]只能進行行選擇,或列選擇,不能同時進行列選擇,列選擇只能是列名。行號和區間選擇只能進行行選擇。當index和columns標簽值存在重復時,通過標簽選擇會優先返回行數據。df.只能進行列選擇,不能進行行選擇。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容