2016-08-01 16 views
5

Chcę użyć .notnull() w kilku kolumnach ramki danych, aby wyeliminować wiersze zawierające wartości "NaN".Jaka jest prawidłowa składnia podczas używania .notnull() w pandach?

powiedzmy mam następujące df:

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

Próbowałem użyć tej składni, ale to nie działa? Czy wiesz, co robię źle?

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

dostaję ten błąd:

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

Co należy zrobić, aby uzyskać następujące dane wyjściowe?

A B C 
0 1 1 1 

Masz pomysł?

+2

Można po prostu zrobić 'df.dropna (podzbioru = [ 'a', 'b', 'c'])' – ayhan

Odpowiedz

7

Można najpierw wybrać podzbiór kolumn przez df[['A','B','C']], a następnie zastosować notnull i określić, czy all wartości w masce są 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 

Innym rozwiązaniem jest z Ayhan komentarzu z dropna:

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

co jest takie samo jak:

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

i oznacza opuszczenie wszystkich wierszy, gdzie jest co najmniej jedna wartość NaN.

+0

Dzięki które mają sens ... Co o '.Wszystkie() "co to robi? i jak to się różni od '.any()'? – MEhsan

+1

'wszystko' oznacza sprawdzenie, czy wszystkie wartości są True, a" any "oznacza sprawdzenie, czy co najmniej jedna wartość jest True. A jeśli użyjesz 'all (1)' lub 'any (1)' znaczy to sprawdź wiersze, ponieważ jest to to samo co 'all (axis = 1)' lub 'any (axis = 1)' – jezrael

+0

Twoje są niesamowite! Wielkie dzięki, mój przyjacielu – MEhsan

1

Można zastosować wiele warunków, łącząc je z operatorem & (działa to nie tylko dla funkcji notnull()).

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

Alternatywnie można po prostu upuścić wszystkie kolumny, które zawierają NaN. Oryginalna DataFrame nie jest modyfikowana, zamiast tego zwracana jest kopia.

df.dropna()