pandas中loc iloc ix的区别

在pandas0.20.0及以上版本,ix已经丢弃,请尽量使用loc和iloc;
观察下面的代码:

>>> s = pd.Series(np.nan, index=[23,34,61,14,0, 1, 2, 3])
>>> s
23   NaN
34   NaN
61   NaN
14   NaN
0    NaN
1    NaN
2    NaN
3    NaN
dtype: float64

分别输入s.iloc[:2],和s.loc[:2]会有什么区别?试试就知道了

>>> s.iloc[:2]
23   NaN
34   NaN
dtype: float64
>>> s.loc[:2]
23   NaN
34   NaN
61   NaN
14   NaN
0    NaN
1    NaN
2    NaN
dtype: float64
>>>

由上面的代码可知,iloc是针对位置的(position-based),而loc是针对标签的(label-based)。即:iloc[:2]返回的是前两行的内容;若假设标签2所在的行为m,则loc[:2]返回的是前m(包括标签2所在的行)行的内容。
那ix呢?观察代码:

>>> s.ix[:2]
23   NaN
34   NaN
61   NaN
14   NaN
0    NaN
1    NaN
2    NaN
dtype: float64
>>>

这里ix的表现和loc一样,仅此而已嘛?再看下一段代码:

>>> s2
a   NaN
b   NaN
c   NaN
1   NaN
2   NaN
3   NaN
dtype: float64
>>> s2.ix[:2]
a   NaN
b   NaN
dtype: float64
>>>

这里ix的表现又和iloc一样了,很奇怪是不是?但仔细观察这两段代码的差别,我们发现,当索引是整型时ix表现的和loc一样,而当索引是混合型时ix表现的和iloc一样。不过这个结论并不是绝对的,下面我们将会说到。现在我们先总结一下,ix容易让人混淆,还是尽量使用另外两个的好。但是,有时当我们想同时基于标签和位置来选取一个df的行和列怎么办?这就引出了ix的例外,对于ix来说,如果是对列进行切片,则不管是整型还是混合型,默认的行为都是和loc一样的。请看例子:

>>> df
    a   b   c   0   1
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]
    a   b   c   0
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

尽管很优雅,但是ix已经被丢弃了,那么我们用iloc和loc该如何进行这样的切片呢?下面将展示如何利用iloc实现上述操作。

>>> df.iloc[:df.index.get_loc('c')+1,:4]
    a   b   c   0
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

这里,我们用到了get_loc(label)这个函数,它的功能是“获取目的标签在索引中的位置”。这里,你可能会问,问什么不用df.iloc[:’c’,:4]呢?还有这种操作?不存在的!!切记:当索引都是整型时,利用iloc和loc都是合法的,但含义不同,iloc[:m]表示选取前m行,loc表示选取到标签m的所有行(包含m那一行);当索引时混合型时,只能用iloc。

你可能感兴趣的:(python,slice)