2016-08-08 10 views
1

Ich habe einen nicht indizierten Pandas-Datenrahmen, wobei jede Zeile aus numerischen und booleschen Werten mit einigen NaNs besteht. Ein Beispiel Zeile in meinem Datenrahmen könnte wie folgt aussehen (mit Variablen oben):Summieren von booleschen Werten in einem Datenframe

X_1 X_2 X_3 X_4 X_5 X_6 X_7 X_8 X_9 X_10 X_11 X_12 
24.4 True 5.1 False 22.4 55 33.4 True 18.04 False NaN NaN 

würde Ich mag eine neue Variable in meinen Datenrahmen hinzuzufügen, rufen Sie es X_13, die die Anzahl der wahren Werte in jeder Reihe ist. So im obigen Fall, würde ich erhalten möchte:

X_1 X_2 X_3 X_4 X_5 X_6 X_7 X_8 X_9 X_10 X_11 X_12 X_13 
24.4 True 5.1 False 22.4 55 33.4 True 18.04 False NaN NaN 2 

Ich habe df[X_13] = df[X_2] + df[X_4] + df[X_8] + df[X_10] versucht, und das gibt mir, was ich will, wenn die Zeile einen NaN in einer Position enthält, in dem ein Boolean erwartet wird. Für diese Zeilen hat X_13 den Wert NaN.

Entschuldigung - das fühlt sich an, als sollte es absurd einfach sein. Irgendwelche Vorschläge?

Antwort

4

Select boolean Spalten und dann Summe:

df.select_dtypes(include=['bool']).sum(axis=1) 

Wenn Sie NaNs haben, zuerst mit falschem des füllen:

df.fillna(False).select_dtypes(include=['bool']).sum(axis=1) 

Betrachten Sie diese Datenrahmen:

df 
Out: 
     a  b c  d 
0 True False 1 True 
1 False True 2 NaN 

df == True liefert True für (0 , C) auch:

df == True 
Out: 
     a  b  c  d 
0 True False True True 
1 False True False False 

Wenn Sie also die Summe nehmen, werden Sie 3 bekommen statt 2. Ein weiterer wichtiger Punkt ist, dass boolean Arrays cannot contain NaNs. Also, wenn Sie die dtypes überprüfen, werden Sie sehen:

df.dtypes 
Out: 
a  bool 
b  bool 
c  int64 
d object 
dtype: object 

Durch die Zusammenarbeit mit False s Füllen Sie eine boolean-Array haben:

df.fillna(False).dtypes 
Out: 
a  bool 
b  bool 
c int64 
d  bool 
dtype: object 

Jetzt können Sie sicher durch die Booleschen Spalten Auswahl summieren.

df.fillna(False).select_dtypes(include=['bool']).sum(axis=1) 
Out: 
0 2 
1 1 
dtype: int64 
+0

Sehr schön - können Sie einige Beispiele hinzufügen, wo es erklären? Vielleicht ist in einer Spalte ein Wert von 1 und eine Kombination aus Wahrheitswert und NaN erforderlich. +1 – jezrael

+0

@jezrael Ich habe den Beitrag aktualisiert. – ayhan

Verwandte Themen