Eliminare i valori mancanti
Rimuova con dropna() le righe o le colonne che contengono NaN, controllando la soglia e il subset di colonne da considerare.
Eliminare i valori mancanti è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Quando eliminare i valori mancanti?
Eliminare le righe con valori mancanti è la strategia di imputazione più semplice, ma è valida solo quando i dati sono Missing Completely At Random (MCAR), ovvero quando la probabilità che un valore sia mancante non dipende né dal valore mancante stesso né da altre variabili. Se i dati mancanti seguono uno schema sistematico (ad esempio, gli intervistati a basso reddito saltano il campo dello stipendio), eliminarli introduce una distorsione. Esaminate sempre il pattern dei valori mancanti prima di decidere di eliminarli.
import pandas as pd
import numpy as np
# Example: randomly missing salary data (MCAR-like)
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Carol', 'Dave'],
'salary': [50000, np.nan, 70000, np.nan]
})
print('Before drop:', df.shape) # (4, 2)
print(df)dropna() — utilizzo di base
DataFrame.dropna() rimuove per impostazione predefinita ogni riga che contiene almeno un valore NaN. Restituisce un nuovo DataFrame; l'originale rimane invariato a meno che non passiate inplace=True. Per dataset piccoli o medi, questo comportamento predefinito è spesso accettabile come primo passaggio rapido di pulizia dei dati.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, np.nan, 3, np.nan],
'b': [10, 20, np.nan, 40],
'c': [100, 200, 300, 400]
})
cleaned = df.dropna()
print(cleaned)
# a b c
# 0 1.0 10.0 100
print('Original shape:', df.shape) # (4, 3)
print('Cleaned shape:', cleaned.shape) # (1, 3)how='all' — eliminare solo le righe completamente NaN
Passare how='all' indica a dropna di rimuovere una riga solo se ogni singolo valore della riga è NaN. È molto meno aggressivo rispetto al valore predefinito how='any'. Usate how='all' quando il dataset contiene righe sparse: vale la pena conservare le righe che contengono alcuni dati, mentre quelle completamente vuote sono chiaramente record inutili.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, np.nan, np.nan],
'b': [2, np.nan, np.nan],
'c': [3, 4, np.nan]
})
# Row 2 has ALL NaN — dropped
# Row 1 has partial NaN — kept with how='all'
cleaned = df.dropna(how='all')
print(cleaned)
# a b c
# 0 1.0 2.0 3.0
# 1 NaN NaN 4.0subset= — controllare solo colonne specifiche
Il parametro subset limita le colonne controllate per la presenza di NaN quando si decide se eliminare una riga. È estremamente utile quando solo alcune colonne sono fondamentali: ad esempio, una riga dovrebbe essere eliminata se manca la colonna user_id o target, mentre un NaN nelle colonne delle feature opzionali può essere accettabile.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'user_id': [1, np.nan, 3],
'score': [88, 95, np.nan],
'notes': ['ok', 'good', np.nan]
})
# Drop row only if user_id is missing — score and notes NaN are ok
cleaned = df.dropna(subset=['user_id'])
print(cleaned)
# user_id score notes
# 0 1.0 88.0 ok
# 2 3.0 NaN NaNthresh= — requisito minimo di valori non nulli
Il parametro thresh conserva una riga solo se contiene almeno thresh valori non NaN. È più flessibile di how='any' o how='all': potete indicare, ad esempio, di conservare una riga se almeno 3 colonne su 5 contengono dati. È utile nei dataset in cui ci si aspetta una certa scarsità di dati, ma si desidera rimuovere le righe completamente vuote.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, np.nan, np.nan],
'b': [2, 3, np.nan],
'c': [4, np.nan, np.nan],
'd': [5, 6, np.nan]
})
# Keep rows with at least 3 non-null values
cleaned = df.dropna(thresh=3)
print(cleaned)
# a b c d
# 0 1.0 2.0 4.0 5.0
# 1 NaN 3.0 NaN 6.0Eliminare le colonne invece delle righe
Per impostazione predefinita, dropna() rimuove le righe (axis=0). Passate axis=1 (o axis='columns') per eliminare invece le colonne che contengono almeno un NaN. È appropriato quando una colonna è quasi vuota e offre poche informazioni: conservarla aggiungerebbe solo rumore a un modello o a una tabella riepilogativa.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3],
'name': ['A', 'B', 'C'],
'temp': [np.nan, np.nan, np.nan], # completely empty column
'score': [80, 90, 85]
})
# Drop columns that have any NaN
cleaned = df.dropna(axis=1)
print(cleaned)
# id name score
# 0 1 A 80
# 1 2 B 90
# 2 3 C 85Eliminare le colonne in base a una soglia di valori mancanti
Un pattern efficace consiste nell'eliminare le colonne che superano una determinata percentuale di valori mancanti. Calcolate la frazione di valori mancanti per ogni colonna, individuate quelle al di sopra della soglia (ad esempio, il 50%) ed eliminatele con df.drop(columns=cols_to_drop). È più mirato di dropna(axis=1), che elimina qualsiasi colonna contenente anche un solo NaN.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, 2, np.nan, 4, 5],
'b': [np.nan, np.nan, np.nan, np.nan, 5], # 80% missing
'c': [1, np.nan, 3, 4, 5] # 20% missing
})
threshold = 0.5
high_missing = df.columns[df.isna().mean() > threshold]
print('Dropping:', high_missing.tolist()) # ['b']
cleaned = df.drop(columns=high_missing)
print(cleaned)Conservare l'indice dopo dropna()
Dopo aver chiamato dropna(), gli indici originali delle righe vengono conservati: se sono state eliminate le righe 1 e 3, il DataFrame rimanente ha gli indici 0, 2, 4. Spesso è utile poter risalire alle posizioni originali, ma a volte potreste desiderare un indice sequenziale che inizi da 0. Chiamate .reset_index(drop=True) dopo l'eliminazione per riassegnare i numeri alle righe.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'val': [1, np.nan, 3, np.nan, 5]
})
cleaned = df.dropna()
print('With original index:')
print(cleaned) # indices 0, 2, 4
cleaned_reset = cleaned.reset_index(drop=True)
print('With reset index:')
print(cleaned_reset) # indices 0, 1, 2dropna() in una pipeline
Poiché dropna() restituisce un DataFrame, si integra naturalmente in una catena di metodi. Inserire dropna() tra i passaggi di caricamento e analisi è un pattern chiaro che mantiene leggibile la pipeline senza variabili temporanee. Potete concatenarlo anche con query(), assign() e groupby().
import pandas as pd
import numpy as np
df = pd.DataFrame({
'region': ['East', 'West', None, 'East'],
'revenue': [100, np.nan, 300, 400]
})
result = (
df
.dropna(subset=['region', 'revenue'])
.groupby('region')['revenue'].sum()
)
print(result)
# region
# East 500.0
# dtype: float64Quando NON eliminare i valori mancanti: preferire il riempimento
Eliminare le righe comporta una perdita di dati. Per le colonne con meno del 5-10% di valori mancanti, il riempimento (imputazione) è generalmente preferibile all'eliminazione. Inoltre, se i valori mancanti sono correlati alla variabile target (Missing Not At Random, MNAR), eliminarli introduce una distorsione. Come regola generale: elimini i valori mancanti solo quando la loro assenza è veramente casuale, il dataset è abbastanza grande da rendere trascurabile la perdita di righe e la colonna o la riga non fornisce informazioni recuperabili.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'user': ['Alice', 'Bob', 'Carol', 'Dave'],
'age': [25, np.nan, 30, np.nan]
})
missing_pct = df['age'].isna().mean()
print(f'Missing age: {missing_pct:.0%}') # 50%
# 50% missing is high — consider imputing instead of dropping
# df['age'].fillna(df['age'].median(), inplace=True)Flusso di lavoro pratico per la pulizia
Un flusso di lavoro pratico per gestire i valori mancanti combina diverse strategie di dropna: prima elimina le righe completamente vuote, poi elimina le colonne vuote per oltre il 60%, quindi elimina le righe in cui mancano colonne ID o target fondamentali e infine riempi i valori NaN sparsi rimanenti. Questo approccio a più livelli consente di preservare la maggior quantità possibile di dati.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3, np.nan],
'feature': [1.0, np.nan, 3.0, 4.0],
'useless': [np.nan, np.nan, np.nan, np.nan]
})
clean = (
df
.dropna(how='all') # remove all-NaN rows
.drop(columns=df.columns[df.isna().mean() > 0.9]) # remove >90% empty cols
.dropna(subset=['id']) # must have an ID
)
print(clean)
# id feature
# 0 1.0 1.0
# 1 2.0 NaN
# 2 3.0 3.0Verifica rapida
Verifichi la Sua comprensione dell'eliminazione dei valori mancanti con dropna().
Riepilogo della lezione
In questa lezione ha imparato che: dropna() rimuove per impostazione predefinita le righe contenenti NaN, how='all' elimina solo le righe completamente vuote, subset= limita il controllo a colonne specifiche e thresh= conserva le righe con un numero minimo di valori non nulli. Utilizzi axis=1 per eliminare le colonne invece delle righe. Ora vedremo come riempire i valori mancanti invece di eliminarli usando fillna().
Impara Python con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Eliminare i valori mancanti» è gratuita?
Sì — il testo completo di «Eliminare i valori mancanti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «Eliminare i valori mancanti»?
Rimuova con dropna() le righe o le colonne che contengono NaN, controllando la soglia e il subset di colonne da considerare. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Eliminare i valori mancanti»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Rilevare i valori mancanti
- Eliminare i valori mancanti
- Riempire i valori mancanti
- Interpolazione e imputazione avanzata