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

问题描述:

我有点惊讶/困惑numpy的和熊猫之间存在下列区别开始:停止切割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符号,但熊猫确实。我认为熊猫是基于Numpy的。这是一个错误?故意的?

+1

为什么你使用'b.ix'而不是'b [:3]'? – abarnert 2013-02-28 01:45:34

记录,而且这也是Advanced Indexing一部分。这里的关键是你根本没有使用停止索引。

ix属性,可以让你通过标签 -choosing标签列表做各种先进的索引,使用标签,而不是指数的半独家范围所包括的范围一件特殊的事情,以及其他各种的东西。

如果你不希望出现这种情况,只是不使用它:

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)。这就是为什么我说问题是你根本没有使用停止索引。

+0

在你的例子中,它会返回一个副本。您需要使用.loc或.iloc分配权限? – 2017-02-15 22:36:46

从(docs):

切片具有标准Python语义整片

...

切片用标签是语义上略有不同,因为 片的开始和结束包容性在基于标签的情况下。

+0

没错,但是你如何才能使基于标签的切片在一端独占鳌头(就像普通的蟒蛇切片一样!) – 2016-07-28 06:37:32

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

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

切片用标签是语义上略有不同,因为 分片开始和结束都包括在基于标签的情况。

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