Pandas中loc,iloc,ix的區別

總結:

loc需要傳入的是index的label。

iloc需要傳入的是index的position(行號)

ix優先按label索引,如果找不到label,再按position索引。

例如:

>>> s = pd.Series(np.nan, index=[49,48,47,46,45, 1, 2, 3, 4, 5])
>>> s
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN
4    NaN
5    NaN

比較下列三個的差異。

s.loc[:3]

s.iloc[:3]

s.ix[:3]
>>> s.loc[:3] 
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN
# s.loc[:3] 返回的是直到索引label爲3的所有行。
>>> s.iloc[:3] 
49   NaN
48   NaN
47   NaN
# s.iloc[:3]返回的是前三行。
>>> s.ix[:3]
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN
# s.ix[:3]先按label索引。

再比如:

>>> s.iloc[:6]
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN

>>> s.loc[:6]
KeyError: 6

>>> s.ix[:6]
KeyError: 6

s.loc[:6]找不到爲6的label,所以發生了KeyError;因爲索引號爲整數類型,s.ix[:6]找不到label爲6的,如果索引號爲混合類型,則不會報錯。

如:

>>> s2 = pd.Series(np.nan, index=['a','b','c','d','e', 1, 2, 3, 4, 5])
>>> s2.index.is_mixed() 
True
>>> s2.ix[:6]
a   NaN
b   NaN
c   NaN
d   NaN
e   NaN
1   NaN

>>> s2.ix[:'c'] 
a   NaN
b   NaN
c   NaN

對於DataFrame數據,如:

>>> df = pd.DataFrame(np.nan, 
                      index=list('abcde'),
                      columns=['x','y','z', 8, 9])
>>> df
    x   y   z   8   9
a NaN NaN NaN NaN NaN
b NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN
d NaN NaN NaN NaN NaN
e NaN NaN NaN NaN NaN



>>> df.ix[:'c', :4]
    x   y   z   8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN


>>> df.iloc[:df.index.get_loc('c') + 1, :4]
    x   y   z   8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章