2013-07-31 17 views
7

Non capisco come i NaN vengano trattati nei panda, sarei felice di avere qualche spiegazione, perché la logica mi sembra "spezzata".Rilasciare NaN da un pda dataframe

Ho un file csv, che sto caricando usando read csv. ho una colonna "commenti" in quel file, che è vuoto la maggior parte delle volte.

Ho isolato quella colonna e ho provato vari modi per eliminare i valori vuoti. In primo luogo, quando im scrittura:

marked_results.comments 

ottengo:

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

Il resto della colonna è NaN. quindi i panda caricano voci vuote come NaN. ottimo finora. Ora sto cercando di cancellare quelle voci. Iv provato:

marked_results.comments.dropna() 

e ricevuto la stessa colonna. nulla è stato lasciato cadere. confuso, avevo cercato di capire il motivo per cui non è stata abbandonata, così ho provato:

marked_results.comments==NaN 

e ricevuto una serie di Falses. Niente era NaNs ... confusionario. poi ho provato:

marked_results.comments==nan 

E ancora, nient'altro che falses. Mi sono incavolato un po 'e ho pensato di essere più intelligente. così ho fatto:

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

Ah, gotya! così ora ho provato:

marked_results.comments==comments_values[2] 

e sorprendentemente, ancora tutti i risultati sono Falses !!! l'unica cosa che ha funzionato è stato:

marked_results.comments.isnull() 

che returnd il risultato desiderato. Qualcuno può spiegare cosa è successo qui ??

+1

[NaN! = NaN] (http: // stackoverflow.it/questions/1565164/what-is-the-rationale-for-all-comparisons-return-false-for-ieee754-nan-values) - leggi la risposta accettata di Stephen Canon. – fvu

risposta

14

Si dovrebbe usare isnull e notnull al test per la NaN (questi sono più robusti utilizzando panda dtypes di NumPy), vedi "values considered missing" in the docs.

Utilizzando il metodo della serie dropna su una colonna non influirà sul dataframe originale, ma fare ciò che si vuole:

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 

Il metodo dropnadataframe ha un argomento sottoinsieme (far cadere le righe che hanno NaN in colonne specifiche):

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

È necessario verificare la funzione NaN con la funzione math.isnan() (oppure numpy.isnan). I NaN non possono essere controllati con l'operatore di uguaglianza.

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

Aiuto Funzione ->

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

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

Grazie mille, che ha risolto la confusione .. – idoda

Problemi correlati