2016-06-21 12 views
3

Ich fand ein Stück Code, den ich nicht wirklich verstehe. Es geht im Grunde wie folgt:Index numpy Array mit pd.Series von boolean

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 

ich diesen Teil wirklich verstehen, es zurückgeben ein pd.Series von boolean mit True bei dem Indizes wobei 4. Nun, der Autor verwendet I indizieren 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]] 

Die neue array macht keinen Sinn für mich, würde Ich mag stattdessen zurück:

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

Kann jemand erklären, was hier geschieht, und wie Ich kann den obigen Code ändern, um zurückzugeben, was ich brauche?

Antwort

4

Die Erklärung liegt in der Tatsache, dass numpy Array und pandas Serie behandeln die Logik Index anders. Der erste behandelt True als 1 und False als 0, während der zweite den Wert mit der logischen True abruft und den Wert dort ablegt, wo die Logik False ist. Zur Demonstration:

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 

Sie sehen, wie sie sich anders verhalten. Da Ihr ein numpy Array ist, können wir den logischen Index nicht verwenden, um den Wert aufzunehmen. Um das gewünschte Ergebnis soll bekommen, können wir versuchen, den Index des wahren Wert von I zu extrahieren und sie dann auf Ihrem array verwenden:

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

Total macht jetzt Sinn, war sich dieses Unterschiedes nicht bewusst! Ein großes Dankeschön! –

3

Es ist ein Fehler. Ich weiß nicht genau, wie numpy I im Index interpretiert. Aber ich bin mir ziemlich sicher, das ist, was beabsichtigt war:

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

Beachten Sie, dass in Pandas '0.18.1' dies eine Warnung aufwirft, die das Verhalten wird sich in Zukunft ändern (oder vielleicht eine nüchterne Warnung) – chrisb

Verwandte Themen