2016-08-01 16 views
5

Ich möchte .notnull() für mehrere Spalten eines Datenrahmens verwenden, um die Zeilen zu eliminieren, die "NaN" -Werte enthalten.Was ist die richtige Syntax bei der Verwendung von .notnull() in Pandas?

Lassen Sie sagen, ich habe folgendes df:

A B C 
0 1 1 1 
1 1 NaN 1 
2 1 NaN NaN 
3 NaN 1 1 

Ich habe versucht, diese Syntax zu verwenden, aber es funktioniert nicht? Weißt du, was ich falsch mache?

df[[df.A.notnull()],[df.B.notnull()],[df.C.notnull()]] 

Ich erhalte diese Fehler:

TypeError: 'Series' objects are mutable, thus they cannot be hashed 

Was soll ich tun, um die folgende Ausgabe zu bekommen?

A B C 
0 1 1 1 

Irgendeine Idee?

+2

können Sie tun, nur 'df.dropna (Teilmenge = [ 'A', 'B', 'C'])' – ayhan

Antwort

7

können Sie erste Teilmenge von Spalten von df[['A','B','C']] wählen, dann gelten notnull und angeben, ob all Werte in der Maske sind True:

print (df[['A','B','C']].notnull()) 
     A  B  C 
0 True True True 
1 True False True 
2 True False False 
3 False True True 

print (df[['A','B','C']].notnull().all(1)) 
0  True 
1 False 
2 False 
3 False 
dtype: bool 

print (df[df[['A','B','C']].notnull().all(1)]) 
    A B C 
0 1.0 1.0 1.0 

Eine andere Lösung ist aus Ayhan Kommentar mit dropna:

print (df.dropna(subset=['A', 'B', 'C'])) 
    A B C 
0 1.0 1.0 1.0 

was ist das gleiche wie:

print (df.dropna(subset=['A', 'B', 'C'], how='any')) 

und bedeutet, dass alle Zeilen gelöscht werden, wobei mindestens ein NaN Wert vorhanden ist.

+0

Dank, die Sinn machen ... was ist mit dem '.all() 'Was macht das? und wie ist es anders als '.any()'? – MEhsan

+1

'all' bedeutet, dass alle Werte True sind und' any' bedeutet, dass mindestens ein Wert True ist. Und wenn man 'all (1)' oder 'any (1)' verwendet, bedeutet dies, Zeilen zu prüfen, weil es das gleiche wie 'all (axis = 1)' oder 'any (axis = 1)' – jezrael

+0

ist. Vielen Dank mein Freund – MEhsan

1

Sie können mehrere Bedingungen anwenden, indem Sie sie mit dem Operator & kombinieren (dies funktioniert nicht nur für die Funktion notnull()).

df[(df.A.notnull() & df.B.notnull() & df.C.notnull())] 
    A B C 
0 1.0 1.0 1.0 

Alternativ können Sie einfach alle Spalten löschen, die NaN enthalten. Der ursprüngliche DataFrame wird nicht geändert, stattdessen wird eine Kopie zurückgegeben.

df.dropna()