2016-12-29 3 views
3

betrachten die Datenrahmen dfWarum muss ich nan bekommen, wenn sie mit loc

df = pd.DataFrame(np.arange(25).reshape(5, 5), list('ABCDE'), list('abcde')) 
print(df) 

    a   b   c   d   e 
A   0   1   2   3   4 
B   5   6   7   8   9 
C  10  11  12  13  14 
D  15  16  17  18  19 
E  20  21  22  23  24 

Ich möchte die Zuordnung der Werte in Zeile 'A' mit den entsprechenden Werten in Zeile 'E' nur ersetzen, wobei die Werte in Zeile 'D' sind gleich Null mod drei

ich schaffe die booleschen Maske

mask = df.loc['D'] % 3 == 0 

Dann mache ich meine Aufgabe

df.loc['A'] = df.loc['E', mask] 

Allerdings habe ich jetzt np.nan in einigen meiner Spalten und meine ganze Datenrahmen ist jetzt float

print(df) 

     a  b  c  d  e 
A 20.0 NaN NaN 23.0 NaN 
B 5.0 6.0 7.0 8.0 9.0 
C 10.0 11.0 12.0 13.0 14.0 
D 15.0 16.0 17.0 18.0 19.0 
E 20.0 21.0 22.0 23.0 24.0 

Wie soll ich über das Erhalten dieses Ergebnis gehen?

a b c d e 
A 20 1 2 23 4 
B 5 6 7 8 9 
C 10 11 12 13 14 
D 15 16 17 18 19 
E 20 21 22 23 24 

Antwort

3

mask Fügen Sie in Ihrem loc für Zeile 'A' statt Zeile 'E':

df.loc['A', mask] = df.loc['E'] 

Der Grund, warum Sie NaN Werte sind zu sehen, ist, dass Sie die ganze Zeile 'A' als nur die maskierte Version der Zeile 'E' neu zuweisen. In der maskierten Version der Zeile 'E' fehlen Einträge für einige Spalten. Daher werden sie mit NaN gefüllt. Der D-Typ für NaN ist float, der alle anderen ganzzahligen Werte als Floats erzwingt. Wenn Sie stattdessen mask in Zeile 'A' verwenden, weisen Sie nur die Standorte zu, die Sie aktualisieren möchten.

Die resultierende Ausgabe:

a b c d e 
A 20 1 2 23 4 
B 5 6 7 8 9 
C 10 11 12 13 14 
D 15 16 17 18 19 
E 20 21 22 23 24 
2

Try this:

In [172]: df.loc['A', df.columns[df.loc['D'] % 3 == 0]] = df.loc['E'] 

In [173]: df 
Out[173]: 
    a b c d e 
A 20 1 2 23 4 
B 5 6 7 8 9 
C 10 11 12 13 14 
D 15 16 17 18 19 
E 20 21 22 23 24 
Verwandte Themen