5

我对 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 包含。我认为 Pandas 是基于 Numpy 的。这是一个错误吗?故意的?

4

3 回答 3

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,突然间,b.ix[:3]将只返回 3 行而不是 4 行,你会感到困惑重新来过。

不同之处在于,在这种情况下,b.ix[:3]索引切片,而不是标签切片。

您在代码中要求的内容实际上在“所有标签最多包括 3”和“所有索引最多但不包括 3”之间是模棱两可的,并且标签总是获胜ix(因为如果你不想要标签切片,你不必ix首先使用)。这就是为什么我说问题在于你根本没有使用停止索引。

于 2013-02-28T01:48:01.297 回答
2

当索引类型为整数时,DataFrame.ix将仅使用基于标签的索引。根据该文件,基于标签的切片将包括开始和停止。

http://pandas.pydata.org/pandas-docs/dev/indexing.html#advanced-indexing-with-labels

带有标签的切片在语义上略有不同,因为切片开始和停止在基于标签的情况下是包含在内的。

带有整数轴标签的基于标签的索引是一个棘手的话题。它已经在邮件列表和科学 Python 社区的各个成员中进行了大量讨论。在 pandas 中,我们的一般观点是标签比整数位置更重要。因此,对于整数轴索引,使用 .ix 等标准工具只能进行基于标签的索引。下面的代码会产生异常

于 2013-02-28T01:53:20.373 回答
1

来自(文档):

切片具有整数切片的标准 Python 语义

...

带有标签的切片在语义上略有不同,因为切片开始和停止在基于标签的情况下是包含在内的。

于 2013-02-28T01:47:55.250 回答