Consigli per la Pulizia dei Dati CSV per Analisti e Sviluppatori
I file CSV sono il formato di scambio universale per i dati tabulari. Sono semplici, leggibili dall'uomo e supportati da ogni strumento, da Excel a pandas. Ma i file CSV del mondo reale sono spesso disordinati — codifiche incoerenti, valori mancanti, tipi di dati misti e righe malformate. Questa guida copre tecniche pratiche per pulire i dati CSV in modo affidabile.
Problemi Comuni dei CSV
1. Problemi di Codifica
Il problema CSV più frustrante è la codifica. Un file creato su Windows in Excel potrebbe usare windows-1252, mentre il tuo script Python si aspetta utf-8.
Sintomi: Caratteri illeggibili (mojibake) come é invece di é, o eccezioni UnicodeDecodeError.
Rilevamento:
import chardet
with open('data.csv', 'rb') as f:
result = chardet.detect(f.read(10000))
print(result) # {'encoding': 'Windows-1252', 'confidence': 0.73}
Correzione: Leggi con la codifica rilevata, poi salva come UTF-8:
import pandas as pd
df = pd.read_csv('data.csv', encoding='windows-1252')
df.to_csv('data_clean.csv', encoding='utf-8', index=False)
2. Delimitatori Incoerenti
Non tutti i "CSV" usano virgole. I file CSV europei spesso usano punti e virgola perché le virgole sono separatori decimali in molte lingue europee.
# Rilevamento automatico del delimitatore
import csv
with open('data.csv', 'r') as f:
dialect = csv.Sniffer().sniff(f.read(5000))
print(f"Delimitatore: {repr(dialect.delimiter)}")
Il nostro Editor CSV gestisce automaticamente il rilevamento del delimitatore — incolla i tuoi dati e identifica il formato.
3. Valori Mancanti
I dati mancanti appaiono in molte forme: celle vuote, NA, N/A, null, -, o solo spazi.
# Standardizza tutte le rappresentazioni dei valori mancanti
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', '-', '', ' '])
# Controlla i valori mancanti per colonna
print(df.isnull().sum())
# Strategia 1: Elimina righe con campi critici mancanti
df = df.dropna(subset=['email', 'name'])
# Strategia 2: Riempi con valori predefiniti
df['country'] = df['country'].fillna('Unknown')
# Strategia 3: Forward fill (serie temporali)
df['price'] = df['price'].ffill()
4. Righe Duplicate
I duplicati esatti sono facili da trovare. I duplicati approssimativi (stessa persona con ortografia del nome leggermente diversa) sono più difficili.
# Trova duplicati esatti
duplicates = df[df.duplicated(keep=False)]
print(f"Trovate {len(duplicates)} righe duplicate")
# Rimuovi duplicati, mantieni la prima occorrenza
df = df.drop_duplicates()
# Rimuovi duplicati in base a colonne specifiche
df = df.drop_duplicates(subset=['email'], keep='last')
5. Formati Dati Incoerenti
Date in formati misti, numeri di telefono con e senza prefisso internazionale, maiuscole incoerenti:
# Standardizza le date
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)
# Standardizza i campi di testo
df['name'] = df['name'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()
# Standardizza i numeri di telefono (base)
df['phone'] = df['phone'].str.replace(r'[^0-9+]', '', regex=True)
6. Problemi di Tipo di Dato
Il CSV memorizza tutto come testo. Numeri con zeri iniziali, codici postali e numeri di telefono possono perdere la formattazione durante il parsing:
# Preserva gli zeri iniziali nei codici postali
df = pd.read_csv('data.csv', dtype={'zip_code': str, 'phone': str})
# Converti stringhe di valuta in numeri
df['price'] = df['price'].str.replace('$', '').str.replace(',', '').astype(float)
Validazione Dopo la Pulizia
Valida sempre i tuoi dati puliti:
# Controlla il conteggio delle righe (abbiamo perso o guadagnato righe inaspettatamente?)
print(f"Righe: {len(df)}")
# Controlla i tipi di dati
print(df.dtypes)
# Controlla gli intervalli di valori
print(df.describe())
# Controlla i null rimanenti
print(df.isnull().sum())
# Valida i vincoli di unicità
assert df['email'].is_unique, "Email duplicate trovate!"
Strumenti da Riga di Comando
Per pulizia rapida senza scrivere codice:
# Converti codifica
iconv -f WINDOWS-1252 -t UTF-8 input.csv > output.csv
# Ordina e rimuovi righe duplicate
sort -u input.csv > output.csv
# Estrai colonne specifiche (cut)
cut -d',' -f1,3,5 input.csv > output.csv
# Filtra righe (awk)
awk -F',' '$3 > 100' input.csv > filtered.csv
Per trasformazioni più complesse, strumenti come csvkit forniscono una suite completa di utilità CSV:
# Installa
pip install csvkit
# Visualizza nomi delle colonne
csvcut -n data.csv
# Filtra righe
csvgrep -c country -m "USA" data.csv > usa_only.csv
# Converti in JSON
csvjson data.csv > data.json
Conversione tra CSV e JSON? Il nostro convertitore CSV in JSON lo gestisce istantaneamente.
FAQ
Qual è la dimensione massima del file per l'elaborazione CSV?
Non c'è un limite intrinseco nel formato CSV. Il limite pratico dipende dai tuoi strumenti: Excel gestisce circa 1 milione di righe, pandas funziona bene fino a diversi GB con RAM adeguata, e strumenti come Dask o Polars gestiscono dataset più grandi della memoria. Per gli strumenti basati su browser, il nostro editor CSV gestisce file fino a 100MB.
Dovrei usare CSV o JSON per lo scambio dati?
Il CSV è migliore per dati tabulari piatti (fogli di calcolo, esportazioni database, liste semplici). JSON è migliore per dati annidati e gerarchici (risposte API, configurazione, documenti con struttura variabile). Per un confronto dettagliato, consulta la nostra guida CSV vs JSON vs XML.
Risorse Correlate
- Editor CSV — Modifica e pulisci dati CSV nel tuo browser
- Guida alla Conversione CSV in JSON — Converti tra formati
- Best Practice per la Formattazione JSON — Lavora con l'output JSON