Tipicamente individuiamo i valori mancanti in termini di spazi vuoti nella tabella dei dati oppure come stringhe segnaposto, per esempio valori NaN (Not A Number).
Eliminazione
Uno dei modi piΓΉ semplici per gestire il problema dei valori mancanti consiste nellβeliminare completamente dal dataset le caratteristiche (colonne) o i campioni (righe) corrispondenti; le righe con valori mancanti possono essere eliminate con facilitΓ tramite il metodo dropna
.
Possiamo eliminare le colonne che hanno almeno un valore NaN in una riga, impostando lβargomento axis
a 1: df.dropna(axis=1)
.
Il problema di questo approccio che rischia di rimuovere fin troppi campioni, il che potrebbe pregiudicare del tutto lβaffidabilitΓ .
Oppure, se rimuoviamo troppe colonne di caratteristiche, corriamo il rischio di perdere informazioni preziose, delle quali il nostro classificatore ha bisogno per poter discriminare le classi.
data = {'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8]}
df = pd.DataFrame(data)
# Rimuovi le righe con dati mancanti
df_dropna_rows = df.dropna()
# Rimuovi le colonne con dati mancanti
df_dropna_columns = df.dropna(axis=1)
DataFrame originale:
A B
0 1.0 5.0
1 2.0 NaN
2 2.0 NaN
3 4.0 8.0
Dopo la rimozione delle righe con dati mancanti:
A B
0 1.0 5.0
3 4.0 8.0
Dopo la rimozione delle colonne con dati mancanti:
A
0 1.0
1 2.0
2 NaN
3 4.0
Interpolazione
Spesso, la rimozione dei campioni o lβeliminazione di intere colonne di caratteristiche non Γ¨ una via percorribile, perchΓ© potremmo perdere troppi dati preziosi. In questo caso, possiamo utilizzare varie tecniche di interpolazione per stimare i valori mancanti sulla base degli altri campioni del dataset. Una delle tecniche di interpolazione piΓΉ comuni Γ¨ lβimputazione media, mediante la quale sostituiamo semplicemente il valore mancante con il valore medio dellβintera colonna di caratteri della caratteristica.
# Riempimento dei dati mancanti con la media della colonna
df_fillna_mean = df.fillna(df.mean())
# Riempimento dei dati mancanti con un valore personalizzato (ad esempio, 0)
df_fillna_custom = df.fillna(0)
DataFrame originale:
A B
0 1.0 5.0
1 2.0 NaN
2 NaN 7.0
3 4.0 8.0
Dopo il riempimento dei dati mancanti con la media:
A B
0 1.0 5.0
1 2.0 6.67
2 2.33 7.0
3 4.0 8.0
Dopo il riempimento dei dati mancanti con un valore personalizzato:
A B
0 1.0 5.0
1 2.0 0.0
2 0.0 7.0
3 4.0 8.0
Pandas fornisce anche tecniche piΓΉ evolute come la stime dei dati mancanti in base ai valori circostanti.
# Esempio di interpolazione lineare
df_interpolated = df.interpolate()
print("DataFrame originale:\n", df)
print("Dopo l'interpolazione:\n", df_interpolated)
Creazione di indicatori (isna
e notna
)
Questa tecnica consiste nel creare colonne ausiliarie per indicare la presenza o lβassenza di dati mancanti.
# Creazione di colonne ausiliarie per indicare i dati mancanti
df['A_missing'] = df['A'].isna()
df['B_present'] = df['B'].notna()
print("DataFrame con indicatori:\n", df)
A B A_missing B_present
0 1.0 5.0 False True
1 2.0 NaN False False
2 NaN 7.0 True True
3 4.0 8.0 False True
Riemissione (ffill
e bfill
)
Questa tecnica riempie i dati mancanti con i valori precedenti (ffill
) o successivi (bfill
) nella stessa colonna.
# Riemissione dei dati mancanti utilizzando il valore precedente
df_ffill = df.ffill()
# Riemissione dei dati mancanti utilizzando il valore successivo
df_bfill = df.bfill()
DataFrame originale:
A B
0 1.0 5.0
1 2.0 NaN
2 NaN 7.0
3 4.0 8.0
Dopo la riemissione (ffill):
A B
0 1.0 5.0
1 2.0 5.0
2 2.0 7.0
3 4.0 8.0
Dopo la riemissione (bfill):
A B
0 1.0 5.0
1 2.0 7.0
2 4.0 7.0
3 4.0 8.0