loc和ix之间的意外差异

Ben*_*Ben 6 python pandas

我注意到在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
Run Code Online (Sandbox Code Playgroud)

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

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

jor*_*ris 2

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

/selection by label的文档loc给出了相关规则(http://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label):

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

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


因为ix我不太确定,而且我认为这没有明确记录。但无论如何,ix它更加宽松,并且有很多边缘情况(回退到整数位置等),而且是一个兔子洞。但一般来说,ix将始终返回使用提供的标签进行索引的结果(因此不会像loc以前那样检查标签是否在索引中),除非它回退到整数位置索引。
在大多数情况下,建议使用loc/iloc