2013-07-31 36 views
7

Nie rozumiem, w jaki sposób NaN są traktowane w pandach, chętnie otrzymam wyjaśnienie, ponieważ logika wydaje mi się "zepsuta".Drop NaNs z pandy dataFrame

Mam plik csv, który ładuję za pomocą odczytu csv. Mam w tym pliku kolumnę "komentarze", która jest pusta przez większość czasu.

Izolowałem tę kolumnę i próbowałem różnymi sposobami, aby upuścić puste wartości. Pierwszy, gdy im pisanie:

marked_results.comments 

uzyskać:

0  VP 
1  VP 
2  VP 
3  TEST 
4  NaN 
5  NaN 
.... 

Reszta kolumny jest NaN. , więc pandy ładują puste wpisy jako NaNs. świetny do tej pory. Teraz próbuję upuścić te wpisy. Iv wypróbował:

marked_results.comments.dropna() 

i otrzymał tę samą kolumnę. nic nie spadło. zdezorientowany, próbowałem zrozumieć, dlaczego nic nie spadło, więc próbowałem:

marked_results.comments==NaN 

i otrzymałem serię Fałszów. Nic nie było NaNs ... mylące. następnie próbowałem:

marked_results.comments==nan 

I znowu, tylko falses. Byłem trochę wkurzony i uważałem się za mądrzejszego. więc zrobiłem:

In [71]: 
comments_values = marked_results.comments.unique() 
comments_values 
Out[71]: 
array(['VP', 'TEST', nan], dtype=object) 

Ah, gotya! więc teraz próbowałem:

marked_results.comments==comments_values[2] 

i zaskakująco, wciąż wszystkie wyniki są fałszywe !!! jedyną rzeczą, która pracowała była:

marked_results.comments.isnull() 

który returnd pożądanego rezultatu. Czy ktoś może wyjaśnić, co się tutaj wydarzyło?

+1

[NaN! = NaN] (http: // stackoverflow.com/questions/1565164/what-is-the-rationale-for-all-comparisons-return-false-for-ieee754-nan-values) - przeczytaj przyjętą odpowiedź Stephena Canona. – fvu

Odpowiedz

14

Należy używać isnull i notnull do testowania NaN (są bardziej wytrzymałe niż przy użyciu pandy dtypes numpy), patrz "values considered missing" in the docs.

Stosując metodę Series dropna na kolumnie nie będzie miało wpływu na oryginalną dataframe, ale to, co chcesz:

In [11]: df 
Out[11]: 
    comments 
0  VP 
1  VP 
2  VP 
3  TEST 
4  NaN 
5  NaN 

In [12]: df.comments.dropna() 
Out[12]: 
0  VP 
1  VP 
2  VP 
3 TEST 
Name: comments, dtype: object 

dropnaDataFrame metoda ma argumentu podzbioru (do spadku wiersze, które mają Nans w określonych kolumnach):

In [13]: df.dropna(subset=['comments']) 
Out[13]: 
    comments 
0  VP 
1  VP 
2  VP 
3  TEST 

In [14]: df = df.dropna(subset=['comments']) 
7

Należy przetestować funkcję NaN za pomocą funkcji math.isnan() (lub). NaN nie można sprawdzić za pomocą operatora równości.

>>> a = float('NaN') 
>>> a 
nan 
>>> a == 'NaN' 
False 
>>> isnan(a) 
True 
>>> a == float('NaN') 
False 

Pomoc Function ->

isnan(...) 
    isnan(x) -> bool 

    Check if float x is not a number (NaN). 
+0

Wielkie dzięki, które rozwiązały zamieszanie .. – idoda