
Nei panda, un valore mancante (NA: non disponibile) è rappresentato da nan (non numero). Nessuno è anche considerato un valore mancante.
In questo articolo vengono descritti i seguenti contenuti.
- Valori mancanti causa dalla lettura di file, ecc.
- nan (non un numero) è considerato un valore mancante
- Nessuno è anche considerato un valore mancante
- La stringa non è considerata un valore mancante
- Infinity inf non è considerato un valore mancante per la previsione predefinita
- pd.NA è il valore sperimentale (a partire da 1.4.0)
Valori mancanti causa dalla lettura di file, ecc.
Leggi un file CSV con valori mancanti, viene generato nan. Nell’output print() di pandas.DataFrame e Series, è scritto come NaN.
import math
import numpy as np
import pandas as pd
df = pd.read_csv('data/src/sample_pandas_normal_nan.csv')[:3]
print(df)
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 1 NaN NaN NaN NaN NaN
# 2 Charlie NaN CA NaN NaN
Metodi come isll(), dropna() e fillna() possono essere utilizzati per rilevare, possono essere utilizzati per essere utilizzati per i valori mancanti.
print(df.isnull())
# name age state point other
# 0 False False False True True
# 1 True True True True True
# 2 False True False True True
print(df.dropna(how='all'))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 2 Charlie NaN CA NaN NaN
print(df.fillna(0))
# name age state point other
# 0 Alice 24.0 NY 0.0 0.0
# 1 0 0.0 0 0.0 0.0
# 2 Charlie 0.0 CA 0.0 0.0
nan in una colonna con oggetto è un tipo float incorporato in Python e nan in una colonna con floatXX è un tipo NumPy numpy.floatXX. Entrambi sono trattati come valori mancanti.
print(df.dtypes)
# name object
# age float64
# state object
# point float64
# other float64
# dtype: object
print(df.at[1, 'name'])
# nan
print(type(df.at[1, 'name']))
# <class 'float'>
print(df.at[1, 'age'])
# nan
print(type(df.at[1, 'age']))
# <class 'numpy.float64'>
Oltre a leggere un file, nan viene utilizzato per rappresentare un valore mancante se l’elemento non esiste quando si chiamano metodi come reindex(), merge() e così via.
nan (non un numero) è considerato un valore mancante
In Python, puoi creare nan con float(‘nan’), math.nan o np.nan. nan è considerato un valore mancante nei panda.
s_nan = pd.Series([float('nan'), math.nan, np.nan])
print(s_nan)
# 0 NaN
# 1 NaN
# 2 NaN
# dtype: float64
print(s_nan.isnull())
# 0 True
# 1 True
# 2 True
# dtype: bool
Nessuno è anche considerato un valore mancante
Nei panda, anche None viene considerato un valore mancante. None è una costante incorporata in Python.
print(None)
# None
print(type(None))
# <class 'NoneType'>
Per le colonne numeriche, None viene convertito in nan quando viene creato un DataFrame o una serie contenente None oppure viene assegnato None a un elemento.
s_none_float = pd.Series([None, 0.1, 0.2])
s_none_float[2] = None
print(s_none_float)
# 0 NaN
# 1 0.1
# 2 NaN
# dtype: float64
print(s_none_float.isnull())
# 0 True
# 1 False
# 2 True
# dtype: bool
Poiché nan è un numero a virgola mobile float, se None viene convertito in nan, il tipo di dati dtype della colonna viene modificato in float, anche se gli altri valori sono interi int.
s_none_int = pd.Series([None, 1, 2])
print(s_none_int)
# 0 NaN
# 1 1.0
# 2 2.0
# dtype: float64
non viene rilevato come valore mancante da isnull(). Naturalmente, è anche gestito da metodi come dropna() e fillna().
s_none_object = pd.Series([None, 'abc', 'xyz'])
print(s_none_object)
# 0 None
# 1 abc
# 2 xyz
# dtype: object
print(s_none_object.isnull())
# 0 True
# 1 False
# 2 False
# dtype: bool
print(s_none_object.fillna(0))
# 0 0
# 1 abc
# 2 xyz
# dtype: object
La stringa non è considerata un valore mancante
Le stringhe ‘NaN’ e ‘None’ sono indistinguibili sul display, ma non sono considerati valori mancanti. Anche la stringa vuota ”non viene considerata come un valore mancante.
s_str = pd.Series(['NaN', 'None', ''])
print(s_str)
# 0 NaN
# 1 None
# 2
# dtype: object
print(s_str.isnull())
# 0 False
# 1 False
# 2 False
# dtype: bool
Se vuoi trattare il valore come un valore mancante, puoi usare il metodo replace() per sostituirlo con float(‘nan’), np.nan e math.nan.
s_replace = s_str.replace(['NaN', 'None', ''], float('nan'))
print(s_replace)
# 0 NaN
# 1 NaN
# 2 NaN
# dtype: float64
print(s_replace.isnull())
# 0 True
# 1 True
# 2 True
# dtype: bool
Nota che le funzioni per leggere il file come read_csv() utilizzato ”, ‘NaN’, ‘null’, ecc. come valori mancanti per la configurazione e per impostazione predefinita li sostituiscono con nan.
Infinity inf non è considerato un valore mancante per la previsione predefinita
Infinity inf non è considerato un valore mancante per la previsione predefinita.
s_inf = pd.Series([float('inf'), -float('inf')])
print(s_inf)
# 0 inf
# 1 -inf
# dtype: float64
print(s_inf.isnull())
# 0 False
# 1 False
# dtype: bool
Se pd.options.mode.use_inf_as_na è impostato su True, inf in pandas.DataFrame e Series viene convertito in nan e trattato come un valore mancante. A differenza di None, anche inf nella colonna dell’oggetto viene convertito in nan.
pd.options.mode.use_inf_as_na = True
print(s_inf)
# 0 NaN
# 1 NaN
# dtype: float64
print(s_inf.isnull())
# 0 True
# 1 True
# dtype: bool
s_inf_object = pd.Series([float('inf'), -float('inf'), 'abc'])
print(s_inf_object)
# 0 NaN
# 1 NaN
# 2 abc
# dtype: object
print(s_inf_object.isnull())
# 0 True
# 1 True
# 2 False
# dtype: bool
Vedi questo articolo su come impostare le opzioni nei panda.
pd.NA è il valore sperimentale (a partire da 1.4.0)
pd.NA è stato introdotto come scalare NA sperimentale in Pandas 1.0.0.
print(pd.NA)
#
print(type(pd.NA))
# <class 'pandas._libs.missing.NAType'>
Mentre nan == nan è False, pd.NA == pd.NA è pd.NA come nel linguaggio R.
print(float('nan') == float('nan'))
# False
print(pd.NA == pd.NA)
#
Naturalmente, pd.NA è considerato un valore mancante.
s_na = pd.Series([None, 1, 2], dtype='Int64')
print(s_na)
# 0
# 1 1
# 2 2
# dtype: Int64
print(s_na.isnull())
# 0 True
# 1 False
# 2 False
# dtype: bool
print(s_na.fillna(0))
# 0 0
# 1 1
# 2 2
# dtype: Int64
Vedere il seguente documento per Int64 nel codice di esempio sopra. Anche se contiene valori mancanti, altri valori interi non vengono convertiti in numeri a virgola mobile.
Si noti che a partire dalla 1.4.0 (febbraio 2022), è ancora “sperimentale” e il suo comportamento potrebbe cambiare.
Avvertimento sperimentale
: il comportamento di pd.NA può ancora cambiare senza preavviso.
Lavorare con i dati mancanti – Sperimentale NA scalare per denotare i valori mancanti – Pandas 1.4.0 documentazione