2013-05-17 13 views
4

我特別在談論Pandas版本0.11,因爲我正忙着用.loc或.iloc替換.ix的使用.ix。我喜歡區分.loc和.iloc的事實,我是否打算按標籤或整數位置進行索引。我發現任何一個人都可以接受布爾數組,但我想保持純粹的用法,以清楚地表達我的意圖。什麼是在熊貓中用布爾數組索引對象的最習慣方法?

回答

3

在11.0的所有三種方法的工作,順便suggested in the docs就是使用df[mask]。然而,這是而不是完成的位置,但純粹使用標籤,所以在我看來loc最好描述實際正在發生。

更新:我問的github這一點,結論在於df.iloc[msk]將給予NotImplementedError(如整數索引面罩)在大熊貓11.1ValueError(如果非整數索引)。

In [1]: df = pd.DataFrame(range(5), list('ABCDE'), columns=['a']) 

In [2]: mask = (df.a%2 == 0) 

In [3]: mask 
Out[3]: 
A  True 
B False 
C  True 
D False 
E  True 
Name: a, dtype: bool 

In [4]: df[mask] 
Out[4]: 
    a 
A 0 
C 2 
E 4 

In [5]: df.loc[mask] 
Out[5]: 
    a 
A 0 
C 2 
E 4 

In [6]: df.iloc[mask] # Due to this question, this will give a ValueError (in 11.1) 
Out[6]: 
    a 
A 0 
C 2 
E 4 

也許值得一提的是,如果你給了面具整數索引,將拋出一個錯誤:

mask.index = range(5) 
df.iloc[mask] # or any of the others 
IndexingError: Unalignable boolean Series key provided 

這表明ILOC實際上並沒有實現,它使用的標籤,因此爲什麼會11.1當我們嘗試這個時,拋出NotImplementedError

+0

謝謝,我沒有考慮整數索引的.iloc行爲。說實話,我實際上已經忘記了這個mask中有一個.index屬性,我把它當作純粹的布爾numpy數組。我同意,由於.index屬性實際上是用來首先進行對齊的,因此.loc可能是最好的選擇。 – snth

0

我目前使用的是[],即__getitem__(),例如,

df = pd.DataFrame(dict(a=range(5))) 
df[df.a%2==0] 
+0

不要使用'dict'構造函數,使用'{'a':range(5)}'它看起來好多了 – jamylak

+0

dict文字也碰巧快了很多。 –

+0

很高興知道速度差異。我更喜歡'dict'構造函數的外觀,也就是說我不必在關鍵字參數周圍添加引號,從而使輸入變得更容易。但是,如果速度差異很大,那麼也許我會切換到字典文字。 – snth

相關問題