2017-01-05 64 views
1

我正在試驗iloc方法。根據文檔,布爾數組是一個允許的輸入。使用布爾數組調用iloc()

我理解這一點的方式是,如果我有一個帶有值F,T,T,T和值的布爾數組idx,我將它作爲輸入傳遞如下:df.iloc(:,idx)然後我將得到df的第2,3和4列(假設df有4列)。

我試圖實現這一點,但我遇到了錯誤。

作爲一個例子,我有一個數據幀DF

  col1 col2 col3 col4 
     0  1  2  3  4 
     1  5  6  7  8 

我也有一個熊貓布爾系列:

 idx = pd.Series(['False', 'True', 'True', 'True']) 

我布爾系列轉換爲布爾np.array:

idx = idx.values 

然後我把它傳給iloc

df.iloc[: , idx] 

我得到的錯誤信息:

IndexError: positional indexers are out-of-bounds 

我不理解,因爲數據幀有4列,我通過4個布爾值。

您的幫助將不勝感激。

+0

更改'idx'中的字符串值爲布爾值:'pd.Series([False,True,True,True])' – enneppi

回答

1

你的問題是你傳遞了一系列字符串而不是一系列布爾值。您沒有創建布爾數組,而是創建了一系列值爲「True」和「False」的字符串。

更改此

idx = pd.Series(['False', 'True', 'True', 'True']) 

對此

idx = pd.Series([False, True, True, True]) 

,你也將不得不使用自己創作的我得到一個NotImplemented誤差df.iloc[:, idx]

因此該系列的值用這個代替:

df.iloc[:, idx.values] 
+1

更確切地說--df.iloc [:,pd.eval(idx)]' –

+0

優秀!根據文檔的values()方法將一個Series轉換爲一個np數組。由於文檔指出我們必須通過輸入布爾數組,因此將idx轉換爲np.array並將其作爲idx.values傳遞是有意義的。我嘗試過並且工作。爲什麼Nickil說我們需要改爲pd.eval(idx)? – im7