2013-07-08 15 views
50

Sto leggendo due colonne di un file csv usando i panda readcsv() e quindi assegnando i valori a un dizionario. Le colonne contengono stringhe di numeri e lettere. Occasionalmente ci sono casi in cui una cella è vuota. A mio parere, il valore letto su quella voce del dizionario dovrebbe essere None ma è invece assegnato nan. Sicuramente None è più descrittivo di una cella vuota in quanto ha un valore nullo, mentre nan dice solo che il valore letto non è un numero.Qual è la differenza tra NaN e None?

La mia comprensione è corretta, qual è la differenza tra None e nan? Perché è stato assegnato nan anziché None?

Inoltre, il mio controllo di dizionario per tutte le celle vuote ha utilizzato numpy.isnan():

for k, v in my_dict.iteritems(): 
    if np.isnan(v): 

Ma questo mi dà un errore dicendo che non posso usare questo controllo per v. Suppongo che sia dovuto a una variabile intera o variabile, non a una stringa destinata. Se questo è vero, come posso verificare v per una "cella vuota"/nan?

+0

Il testo 'qwerty' non è un numero. –

+1

@RobertHarvey Lo so, quindi sicuramente "Nessuno" sarebbe una descrizione migliore del valore di una cella vuota. – user1083734

+0

@ user1083734 la mia risposta descrive che – Stephan

risposta

49

NaN viene utilizzato come segnaposto per missing data consistently in pandas, la coerenza è buona. Di solito leggo/traduco NaN come "mancante". Vedere anche la sezione 'working with missing data' nella documentazione.

Wes scrive nella documentazione 'choice of NA-representation':

Dopo anni di uso di produzione [NaN] si è dimostrato, almeno a mio parere, di essere la decisione migliore dato lo stato delle cose in NumPy e Python in generale. Il valore speciale NaN (Not-A-Number) viene utilizzato ovunque come valore NA e vi sono le funzioni API isnull e notnull che possono essere utilizzate nei dtype per rilevare i valori NA.
Quindi, ho scelto l'approccio Pythonic "praticità picchi di purezza" e ho scambiato la capacità di numeri interi NA per un approccio molto più semplice dell'utilizzo di un valore speciale in array float e object per indicare NA e promozione di array di numeri interi a floating quando le NA devono essere introdotte.

Nota: il "gotcha" that integer Series containing missing data are upcast to floats.

A mio parere il motivo principale per utilizzare NaN (oltre None) è che può essere conservato con DTYPE float64 di NumPy, piuttosto che l'oggetto DTYPE meno efficiente, vedere NA type promotions.

# without forcing dtype it changes None to NaN! 
s_bad = pd.Series([1, None], dtype=object) 
s_good = pd.Series([1, np.nan]) 

In [13]: s_bad.dtype 
Out[13]: dtype('O') 

In [14]: s_good.dtype 
Out[14]: dtype('float64') 

commenti Jeff (in basso) su questo:

np.nan consente per le operazioni vectorized; è un valore float, mentre None, per definizione, forza il tipo di oggetto, che sostanzialmente disabilita tutta l'efficienza in numpy.

Quindi ripetere 3 volte veloce: oggetto == male, galleggiante == buona

Detto questo, molte operazioni possono ancora funzionare altrettanto bene con Nessuno vs NaN (ma forse sono non supportato ossia possono a volte dare surprising results):

In [15]: s_bad.sum() 
Out[15]: 1 

In [16]: s_good.sum() 
Out[16]: 1.0 

Per rispondere alla seconda domanda:
Si dovrebbe usare pd.isnull e pd.notnull per verificare i dati mancanti (NaN).

+9

aggiungendo semplicemente 2c qui .... '' np.nan'' consente operazioni vettorializzate; è un valore float, mentre '' None'' per definizione forza il tipo '' object'', e praticamente disabilita tutta l'efficienza in numpy, quindi ripeti 3 volte velocemente: '' object == bad, float == good'' – Jeff

+0

vedi inoltre: http://stackoverflow.com/a/19866269/1240268 –

-2

NaN stants per NON un numero.
None potrebbe corrispondere a qualsiasi.

2

La funzione isnan() controlli per vedere se qualcosa è "non un numero" e tornerà o meno di una variabile è un numero, ad esempio isnan(2) sarebbe tornato falsi

il condizionale myVar is not None restituisce se la variabile è definito

vostro array NumPy utilizza isnan() perché destinato ad essere una matrice di numeri e inizializza tutti gli elementi della matrice di NaN questi elementi sono considerati "vuoto"

+1

Penso che 'isnan (2)' restituisca 'False', poiché 2 non è un NaN. – heltonbiker

+0

Inoltre, 'numpy.empty' non inizializza i valori dell'array su' NaN'. Semplicemente non inizializza i valori. – heltonbiker

+0

@heltonbiker idk quello che stavo pensando – Stephan

7

NaN può essere utilizzato come valore numerico sulle operazioni matematiche, mentre None non può (o almeno non dovrebbe).

NaN è un valore numerico, come definito in IEEE 754 floating-point standard. None è un tipo Python interno (NoneType) e sarebbe più simile a "inesistente" o "vuoto" che "numericamente non valido" in questo contesto.

I principali "sintomo" di quella è che, se si esegue, ad esempio, una media o una somma su un array contenente NaN, anche una sola, si ottiene come risultato NaN ...

In D'altra parte, non è possibile eseguire operazioni matematiche utilizzando None come operando.

Quindi, a seconda dei casi, è possibile utilizzare None per dire al proprio algoritmo di non considerare valori non validi o inesistenti sui calcoli. Ciò significherebbe che l'algoritmo dovrebbe testare ciascun valore per vedere se è None.

Numpy ha alcune funzioni per evitare che i valori NaN contaminino i risultati, ad esempio nansum e nan_to_num, ad esempio.

+0

Sono d'accordo con te che Nessuno dovrebbe essere usato per voci inesistenti, quindi perché 'df = pd.readcsv ('file.csv')' mi dai valori 'NaN' per le celle vuote e non' None'? Per quanto ne so, pd.DataFrames non sono esclusivi per i numeri. – user1083734

+0

Beh, probabilmente è una scelta di design. Suppongo che DataFrames e Series abbiano un 'dtype', quindi i valori non validi di' dtype = float' devono essere rappresentati da valori numerici, che 'NaN' è e' None' non lo è ('None' è di' NoneType'). – heltonbiker

+0

Inoltre, molti metodi di Pandas hanno un argomento 'na', che consente di decidere quale valore si intende utilizzare per sostituire i valori non disponibili – heltonbiker

Problemi correlati