2013-02-28 36 views
5

我有點驚訝/困惑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

回答

3

記錄,而且這也是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

1

從(docs):

切片具有標準Python語義整片

...

切片用標籤是語義上略有不同,因爲 片的開始和結束包容性在基於標籤的情況下。

+0

沒錯,但是你如何才能使基於標籤的切片在一端獨佔鰲頭(就像普通的蟒蛇切片一樣!) – 2016-07-28 06:37:32

2

當索引類型爲整數時,DataFrame.ix將僅使用基於標籤的索引。根據該文件,基於標籤的切片將包括啓動和停止。

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

切片用標籤是語義上略有不同,因爲 分片開始和結束都包括在基於標籤的情況。

帶整數軸標籤的基於標籤的索引是一個棘手的話題。它已經在科學Python社區的郵件列表和各種成員 中進行了大量討論。在熊貓中,我們的一般觀點 是標籤比整數位置更重要。因此,對於 整數軸索引,只有基於標籤的索引可以使用 標準工具(如.ix)。以下代碼會產生例外

相關問題