總結:
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