在Pandas中对DataFrame进行子集化时,我注意到loc
和ix
之间存在奇怪的差异。
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行时抛出错误?这是一个错误吗?如果没有,为什么loc
和ix
会这样设计?
(注意我在Python 3.5.1上使用Pandas 0.17.1)
答案 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