我对numpy和Pandas之间的以下差异感到有些惊讶/困惑
import numpy as np
import pandas as pd
a = np.random.randn(10,10)
> a[:3,0, newaxis]
array([[-1.91687144],
[-0.6399471 ],
[-0.10005721]])
然而:
b = pd.DataFrame(a)
> b.ix[:3,0]
0 -1.916871
1 -0.639947
2 -0.100057
3 0.251988
换句话说,numpy不包含stop
符号中的start:stop
索引,但是Pandas会这样做。我以为熊猫是以Numpy为基础的。这是一个错误吗?故意的?
答案 0 :(得分:3)
此已记录,并且它是Advanced Indexing的一部分。这里的关键是你根本没有使用停止索引。
ix
属性是一项特殊功能,可让您通过标签执行各种高级索引 - 选择标签列表,使用包含范围的标签而不是半标签 - 独家指数范围和其他各种事物。
如果您不想这样,请不要使用它:
In [191]: b[:3][0]
Out[191]:
0 -0.209386
1 0.050345
2 0.318414
Name: 0
如果你在不阅读文档的情况下再多玩一次,你可能会想出一个案例,你的标签是'A', 'B', 'C', 'D'
而不是0, 1, 2, 3
,而且突然,{{ 1}}只返回3行而不是4行,你会再次感到困惑。
不同的是,在这种情况下,b.ix[:3]
是 indices 上的切片,而不是标签上的切片。
您在代码中要求的内容实际上在“包括3的所有标签”和“包括但不包括3的所有索引”之间存在模糊不清,标签总是以b.ix[:3]
获胜(因为如果您不想要标签切片,你不必首先使用ix
。这就是为什么我说问题是你根本没有使用停止索引。
答案 1 :(得分:2)
当索引类型为整数时,DataFrame.ix
将仅使用基于标签的索引。根据该文件,基于标签的切片将包括开始和停止。
http://pandas.pydata.org/pandas-docs/dev/indexing.html#advanced-indexing-with-labels
使用标签进行切片在语义上略有不同,因为 在基于标签的情况下,切片开始和停止是包含在内的。
使用整数轴标签的基于标签的索引是一个棘手的主题。它 已经在邮件列表和各个成员之间进行了大量讨论 科学Python社区。在熊猫中,我们的一般观点 是标签比整数位置更重要。因此,有了 整数轴索引只能使用基于标签的索引 标准工具,如.ix。以下代码将生成异常
答案 2 :(得分:1)
从(docs):
切片具有整数切片的标准Python语义
...
使用标签进行切片在语义上略有不同,因为 在基于标签的情况下,切片开始和停止是包含在内的。