开始:停止切换numpy和Pandas之间的不一致?

时间:2013-02-28 01:38:31

标签: python numpy pandas

我对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为基础的。这是一个错误吗?故意的?

3 个答案:

答案 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语义

     

...

     

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