2016-06-21 20 views
3

我發現了一段代碼,我真的不明白。它基本上是這樣的:指數numpy數組與pd.Series的布爾值

array = np.ones((5, 4))*np.nan 
s1 = pd.Series([1,4,0,4,5], index=[0,1,2,3,4]) 
I = s1 == 4 
print(I) 

0 False 
1  True 
2 False 
3  True 
4 False 
dtype: bool 

我真的能理解這部分,它在其中4是指標返回布爾的pd.Series與True。現在,筆者採用I索引array

array[I,0] = 3 
array[I,1] = 7 
array[I,2] = 2 
array[I,3] = 5 
print(array) 

[[ 3. 7. 2. 5.] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan] 
[ nan nan nan nan] 
[ nan nan nan nan]] 

array是沒有意義的,我想,而不是返回:

[[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan]] 

有人能解釋這裏發生了什麼,以及如何我可以改變上面的代碼來返回我需要的東西?

回答

4

其原因在於這樣一個事實:numpy陣列和pandas系列治療邏輯指數不同。前者將True視爲1,將False視爲0,而後者視爲邏輯爲True的值,並將邏輯爲False的值下降。作爲示範:

import numpy as np 
import pandas as pd 

arr = np.array([1,2,3,4,5]) 
arr       # this is a numpy array 
array([1, 2, 3, 4, 5]) 
arr[[True, False, True]] 
array([2, 1, 2])    # check here how it is actually picking the value at position 
           # 1 and 0 alternatively; 

ser = pd.Series([1,2,3,4,5]) 
ser       # this is a pandas Series 
0 1 
1 2 
2 3 
3 4 
4 5 
dtype: int64 
ser[[True, False, True]]  # in pandas Series, it will pick up values where the logic is True; 
0 1 
2 3 
dtype: int64 

您會看到它們的行爲有何不同。由於您的array是一個numpy數組,我們不能使用邏輯索引來獲取數值。爲了得到你想要的結果,我們可以嘗試從I提取真實價值的指標,然後用它在你的array

array[I[I == True].index,0] = 3 
array[I[I == True].index,1] = 7 
array[I[I == True].index,2] = 2 
array[I[I == True].index,3] = 5 
print(array) 


[[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan]] 
+0

現在完全合理,沒有意識到這種差異!十分感謝你! –

3

它是一個錯誤。我不知道numpy是如何在索引中解釋I的。但我敢肯定,這是想要的結果:

array[I.values, 0] = 3 
array[I.values, 1] = 7 
array[I.values, 2] = 2 
array[I.values, 3] = 5 
print(array) 

[[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan] 
[ 3. 7. 2. 5.] 
[ nan nan nan nan]] 
+1

注意,在大熊貓'0.18.1'這就提出了一個警告,這種行爲將會在未來發生變化(或者可能是一種numpy警告) – chrisb