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