我注意到在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]]?这是一个错误吗?如果不是,为什么loc而ix这样设计?
(注意我在Python 3.5.1上使用Pandas 0.17.1)
正如 @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
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |