Pandas 中 ix、loc、iloc的区别用法

最近在学 pandas这个库,感觉这个库确实厉害,它的简洁性和易用性让它成为数据分析得心应手的工具。

本文就不讲如何安装以及怎么入门,主要讲的是 Pandas 中 ix、loc、iloc 的区别用法。

简单解释

  • loc:从索引获取具有特定标签的行(或列),可以通过行号行标签
  • iloc:获取索引中特定位置的行(或列),所以它只需要整数也就是行号
  • ix:通常会像loc一样行为,但是如果索引中不存在标签,则会回到像iloc一样的行为

注意:

ix 的行为与索引值类型有关。如果索引值为integer类型时,比如[1, 2, 3, 4, 5],ix 就和 loc 一样,是把索引值比如5当作行标签而不是行号进行处理;当索引值为混合型时,比如['a', 'b', 'd', 1, 2, 3, 4]时,ix 就和 iloc 一样了,把索引值比如3当作行号而不是行标签来处理。

使用举例

Series

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
In [69]: data = Series(np.nan, index=[49,48,47,46,45, 1, 2, 3, 4, 5])
In [70]: data
Out[70]:
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
dtype: float64
In [71]: data.iloc[:3]
Out[71]:
49 NaN
48 NaN
47 NaN
dtype: float64
In [73]: data.loc[:3]
Out[73]:
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
dtype: float64
In [74]: data.ix[:3]
Out[74]:
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
dtype: float64

当索引值是整数类型时:

iloc是通过行号进行切片,也就是前面三行

loc是通过行标签切片至行标签为 3 那里,并且包括 3

ixloc一样,因为 3 在索引里面

并且使用 ix 的时候,有提示让我们不要再用 ix 这种方法了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [75]: data.iloc[:6]
Out[75]:
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
dtype: float64
In [76]: data.loc[:6]
KeyError: 6
In [77]: data.loc[:6]
KeyError: 6

iloc同样是行号,前面六行

loc报错,因为索引是整型数字,所以会将 6 理解为行标签为 6 的行,找不到自然报错

ixloc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
In [78]: data2 = Series(np.nan, index=['a','b','c','d','e', 1, 2, 3, 4, 5])
In [79]: data2
Out[79]:
a NaN
b NaN
c NaN
d NaN
e NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
dtype: float64
In [80]: data2.ix[:6] ## like iloc
Out[80]:
a NaN
b NaN
c NaN
d NaN
e NaN
1 NaN
dtype: float64
In [81]: data2.ix[:'c'] ## like loc
Out[81]:
a NaN
b NaN
c NaN
dtype: float64

从上面可以看出,当索引类型为混合类型时,ix 既可以像 iloc,也可以像 loc

DataFrame

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
In [84]: df = DataFrame(np.nan, index=list('abcde'), columns=['x', 'y', 'z', 8, 9])
In [85]: df
Out[85]:
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
In [86]: df.ix[:'c', 2:4]
Out[86]:
z 8
a NaN NaN
b NaN NaN
c NaN NaN
In [87]: df.iloc[:, 2:4]
Out[87]:
z 8
a NaN NaN
b NaN NaN
c NaN NaN
d NaN NaN
e NaN NaN
In [95]: df.loc['b':'e', 'x':'z']
Out[95]:
x y z
b NaN NaN NaN
c NaN NaN NaN
d NaN NaN NaN
e NaN NaN NaN

总结

使用建议:

1)当用行号索引的时候, 尽量用 iloc 来进行索引;

2)而用行标签索引的时候用 loc;

3)ix 就别用了。