Skip to content

Valori mancanti in pandas (nan, None, pd.NA)

Python

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