pandas中loc iloc ix的区别

来源:互联网 发布:网络收音下载 编辑:程序博客网 时间:2024/05/20 04:15

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

>>> s = pd.Series(np.nan, index=[23,34,61,14,0, 1, 2, 3])>>> s23   NaN34   NaN61   NaN14   NaN0    NaN1    NaN2    NaN3    NaNdtype: float64

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

>>> s.iloc[:2]23   NaN34   NaNdtype: float64>>> s.loc[:2]23   NaN34   NaN61   NaN14   NaN0    NaN1    NaN2    NaNdtype: float64>>>

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

>>> s.ix[:2]23   NaN34   NaN61   NaN14   NaN0    NaN1    NaN2    NaNdtype: float64>>>

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

>>> s2a   NaNb   NaNc   NaN1   NaN2   NaN3   NaNdtype: float64>>> s2.ix[:2]a   NaNb   NaNdtype: float64>>>

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

>>> df    a   b   c   0   1a NaN NaN NaN NaN NaNb NaN NaN NaN NaN NaNc NaN NaN NaN NaN NaNd NaN NaN NaN NaN NaNe NaN NaN NaN NaN NaN>>> df.ix[:'c',:4]    a   b   c   0a NaN NaN NaN NaNb NaN NaN NaN NaNc NaN NaN NaN NaN

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

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

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