我认为[0:0]的loc切片应该产生空输出。这是一个错误吗?Pandas DataFrame loc索引的切片行为不正确
>>> df
0 1 2 3
0 1 21 51 61
1 2 22 52 62
2 3 23 53 63
>>> df.loc[0:0]
0 1 2 3
0 1 21 51 61
我认为[0:0]的loc切片应该产生空输出。这是一个错误吗?Pandas DataFrame loc索引的切片行为不正确
>>> df
0 1 2 3
0 1 21 51 61
1 2 22 52 62
2 3 23 53 63
>>> df.loc[0:0]
0 1 2 3
0 1 21 51 61
没有,基于位置的索引具有包容端点pandas
数据结构。见Caveats and Gotchas.
与标准的Python序列切片,其中切片 端点不是包容性相比,大熊猫基于标签的切片是包容。 主要原因在于,通常不可能容易地确定 索引中的特定标签之后的“后继”或下一个元素。
如果使用整数位置基于索引,像iloc
,这会像香草python
的数据结构:
In [5]: df
Out[5]:
0 1 2 3
0 1 21 51 61
1 2 22 52 62
2 3 23 53 63
In [6]: df.iloc[0:0]
Out[6]:
Empty DataFrame
Columns: [0, 1, 2, 3]
Index: []
In [7]: df.loc[0:0]
Out[7]:
0 1 2 3
0 1 21 51 61
In [8]:
切片通常是在第一索引包容性和排他性上的第二个。例如:
x = [1,2,3,4,5]
print x[0:0]
# prints [], the empty list.
然而,说平原日在开始和结束索引都包括用于loc
功能文档:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html
用标签切片对象,例如'a':'f'(注意,与通常的蟒蛇片 相反,开始和结束都包括在内!)。
为什么熊猫想要这样的巨魔?只有天知道。
他们为什么会引入与语言语义不一致的行为? –
我不确定,我现在也有些脾气暴躁。直到你发布它,我实际上并不知道这一点(我不经常使用Panda,只是纯粹的numpy通常会为我制造诡计) – mwm314
非常好的答案。然而,这种行为是令人沮丧和不直观的 – mwm314
不是正确的论坛来问这个问题。但是,如果切片被禁用/提出错误,平均开发人员会更高兴,而不是给出稍微不同的行为! –
@Ajeet不,基于位置的切片是惊人的,会让任何开发者更开心。如果他们阅读文档,普通开发人员会更开心。 –