loc和ix之间的意外差异

时间:2015-12-14 04:10:54

标签: python pandas

在Pandas中对DataFrame进行子集化时,我注意到locix之间存在奇怪的差异。

import pandas as pd

# Create a dataframe
df = pd.DataFrame({'id':[10,9,5,6,8], 'x1':[10.0,12.3,13.4,11.9,7.6], 'x2':['a','a','b','c','c']})
df.set_index('id', inplace=True)

df
      x1 x2
id         
10  10.0  a
9   12.3  a
5   13.4  b
6   11.9  c
8    7.6  c


df.loc[[10, 9, 7]] # 7 does not exist in the index so a NaN row is returned
df.loc[[7]] # KeyError: 'None of [[7]] are in the [index]'
df.ix[[7]] # 7 does not exist in the index so a NaN row is returned

为什么df.loc[[7]]会在df.ix[[7]]返回NaN行时抛出错误?这是一个错误吗?如果没有,为什么locix会这样设计?

(注意我在Python 3.5.1上使用Pandas 0.17.1)

2 个答案:

答案 0 :(得分:2)

正如@shanmuga所说,这是(至少loc预期和记录的行为,而不是错误

关于loc /标签选择的文档,给出了关于此的规则(http://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label):

  

您要求的标签中至少有一个必须在索引中,否则将引发KeyError!

这意味着将loc与单个标签(例如df.loc[[7]])一起使用,如果此标签不在索引中,但在将其与标签列表一起使用时会引发错误(例如{{1如果这些标签中至少有一个在索引中,则不会引发错误。

对于df.loc[[7,8,9]]我不太确定,我认为这并没有明确记录。但无论如何,ix更宽松,并且有很多边缘情况(回退到整数位置等),而且是一个兔子洞。但一般情况下,ix将始终返回使用提供的标签索引的结果(因此不会检查标签是否在ix中的索引中),除非掉落回到整数位置索引 在大多数情况下,建议使用loc / loc

答案 1 :(得分:1)

我认为这种行为是有意的,而不是错误。
虽然我找不到任何官方文档,但我发现 jreback于2014年3月21日发表评论<{3}}表明了这一点。

  

ix可以巧妙地给出错误的结果(使用偶数指数)

     

你可以使用你想要的任何功能; ix仍然存在,但它不提供loc提供的保证,即它不会将数字解释为位置


至于为何设计如此
issue on GitHub

中所述
  

.ix支持基于混合整数和标签的访问。它主要基于标签,但将回退到整数位置访问,除非相应的轴是整数类型。

在我看来,提出一个KeyError将是不明确的,因为它是来自索引还是整数位置。相反,ix在给定列表时会返回NaN