La base di ogni progetto di data science di successo è dati puliti e coerenti. Tuttavia nel frenetico processo di analisi, anche utenti esperti di Python a volte incontrano trabocchetti di pre-elaborazione dei dati evitabili. Che tu stia modellando dati per un modello di machine learning o preparando i dati per la visualizzazione, sapere quali errori tenere d'occhio può risparmiarti innumerevoli ore di frustrazione e portare a risultati molto più robusti.
Analizziamo cinque dei più comuni (e spesso fatali) errori di pulizia dei dati in Python, completi di consigli pratici ed esempi illustrativi, in modo che tu possa mantenere i tuoi flussi di lavoro solidi ed efficienti.
Una delle prime problematiche con cui ti imbatti in qualsiasi set di dati reale è la mancanza di dati. In Python, soprattutto con strumenti come pandas, sostituire o rimuovere NaN è facile: df.dropna() o df.fillna(0) lo fanno in una riga. Ma facile non significa corretto.
Rimuovere automaticamente righe con valori mancanti può ridurre drasticamente l'insieme di dati o—as in casi in cui la mancanza sia correlata—intrudurre bias (scostamento). Riempire i valori con la media o con zero può distorcere le distribuzioni, soprattutto nelle colonne non numeriche o in quelle con outlier (valori anomali).
Considera questo frammento:
# Too hasty with missing value treatment
import pandas as pd
df = pd.read_csv('survey.csv')
df = df.dropna()  # Danger: goodbye valuable data!
Se il 30% delle righe manca di un unico campo facoltativo — ad esempio, l'età — perderesti il 30% dei tuoi dati. Se le età mancanti sono per lo più concentrate in una specifica fascia demografica, il risultato è un set di dati che non rappresenta più accuratamente la popolazione.
df.isnull().sum() o df.info() per rilevare schemi di valori mancanti.sklearn.impute.SimpleImputer per riempimenti informati, o logiche specifiche del dominio.
I dati raccolti da diverse fonti raramente si adattano in modo impeccabile a un unico formato. Le date, le categorie e le codifiche delle stringhe sono particolarmente soggetti a errori sottili e difficili da tracciare.
dtype: object), disabilitando operazioni numeriche.Problema classico di Python:
# Date times imported as strings, causing issues
import pandas as pd
df = pd.read_csv('sales.csv')
df['created_at'].min()  # Only finds the minimum string, not chronological min
df.dtypes espone rapidamente colonne che dovrebbero essere numeric ma non lo sono.pd.to_datetime(), pd.to_numeric(), e conversioni di categoria non appena importi i dati..str.lower().str.strip() per le colonne di categoria; sostituisci sinonimi o errori di battitura con un valore coerente.encoding (encoding='utf-8' o encoding='cp1252').df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')
df = df.dropna(subset=['created_at'])  # Rimuovi righe in cui le date non sono parseabili
Una piccola attenzione qui previene ore di debugging per analisi strane in seguito.
Gli outlier sono le carte jolly della pulizia dei dati: a volte segnalano errori di immissione dei dati; altre volte, sono proprio gli eventi degni di essere studiati!
Gli script automatizzati che eliminano valori al di fuori di un certo intervallo senza considerare il contesto possono togliere dati sia errori sia segnali importanti.
Un set di dati sanitari ha una colonna della pressione sanguigna. Alcuni valori sono registrati come 400, potenzialmente un errore di dati (unità o problema di input). Altri potrebbero essere casi limite, come emergenze ipertensive. Rimuovere in blocco tutti i valori superiori a 200 potrebbe cancellare pazienti reali e rari che sarebbero essenziali negli studi medici.
# Don't just drop anything >200 without context
bp_outliers = df[df['blood_pressure'] > 200]
print(bp_outliers)  # Investigate: are these errors or medically relevant cases?
df.describe() e visualizzazioni come box plot o istogrammi per scoprire dettagli della distribuzione e individuare outlier.Quando gli outlier si rivelano validi, possono rimodellare le intuizioni aziendali guidate dai dati.
I dati duplicati sono diffusi— errori di inserimento dati, scraping web o guasti di sistema li introducono. Mentre Python ti permette di df.drop_duplicates() in un attimo, il vero pericolo è capire da dove provengono i duplicati o come risolverli al meglio.
Un database al dettaglio potrebbe contenere più righe per lo stesso ordine del cliente a causa di invii di sistema ripetuti. Rimuovere tutte le righe tranne una funziona solo se ogni colonna corrisponde; altrimenti, si rischia di perdere informazioni.
# Problematic: Dropping all duplicates based only on 'order_id'
df = df.drop_duplicates(subset=['order_id'])  # Could lose different addresses or notes attached to split-row orders
Se colonne come 'delivery_notes' differiscono tra le righe, eliminare i duplicati in modo cieco può causare perdita di dati o non riuscire a riconciliare informazioni in conflitto.
df.duplicated(subset=key_cols, keep=False) to flag true duplicates.is_duplicate for downstream analysis is preferred to outright removal.Here’s how you might aggregate potentially useful fields before deduplication:
def collapse_order_notes(notes):
    return '; '.join(sorted(set(x for x in notes if pd.notnull(x))))
rollup = df.groupby('order_id').agg({
    'customer_id': 'first',
    'total_amount': 'sum',
    'delivery_notes': collapse_order_notes
}).reset_index()
This protects important ancillary data.
Molti algoritmi potenti richiedono input numerici, non etichette o categorie di stringhe dirette. L'encoding delle colonne categoriche è un passaggio cruciale, ma affrettare o scegliere il metodo sbagliato può degradare le prestazioni del modello e introdurre bug.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# Label encoding ignores category meaning
le = LabelEncoder()
df['city_code'] = le.fit_transform(df['city'])  # Problem: Model interprets numbers mathematically
0,1,2) se le etichette hanno un ordine naturale (es., taglia: S < M < L). Altrimenti, opt for one-hot o altri encodings.pd.get_dummies(df, drop_first=True, dummy_na=False), oppure per caratteristiche ad alta cardinalità, considera hashing o encoding di destinazione.fit/transform di sklearn) in modo che l'implementazione del modello ottenga mappe identiche — una trappola classica quando nuove categorie non viste appaiono negli input reali.city_counts = df['city'].value_counts()
# Only encode cities appearing at least 10 times
common_cities = city_counts[city_counts > 10].index
df['city'] = df['city'].apply(lambda x: x if x in common_cities else 'Other')
df = pd.get_dummies(df, columns=['city'], drop_first=True)
Questo mantiene la dimensione delle feature pratiche e modelli robustsi.
La pulizia dei dati in Python richiede rispetto per dettagli sottili non solo velocità. Evitando pulizie meccaniche o prive di contesto, elevi il tuo lavoro di data science e analisi ben al di sopra della media. Rivedi i valori mancanti con intento, porta coerenza ai formati, tratta gli outlier come segnali e non solo rumore, ispeziona i duplicati e pensa in modo tattico all'encoding delle categorie.
Con queste lezioni e un occhio critico sui tuoi dati, trascorrerai meno tempo a tornare sui propri passi, minimizzerai errori imbarazzanti in produzione e costruirai una reputazione per realizzare pipeline di dati su cui gli analisti si fidano. E nel campo in continua crescita della data science, diventare la persona i cui dati sono davvero pronti per l'analisi è una vera superpotenza.