Conseils de Nettoyage de Données CSV pour Analystes et Développeurs
Les fichiers CSV sont le format d'Ă©change universel pour les donnĂ©es tabulaires. Ils sont simples, lisibles par l'humain et supportĂ©s par tous les outils, d'Excel Ă pandas. Mais les fichiers CSV du monde rĂ©el sont souvent dĂ©sordonnĂ©s â encodages incohĂ©rents, valeurs manquantes, types de donnĂ©es mixtes et lignes malformĂ©es. Ce guide couvre les techniques pratiques pour nettoyer les donnĂ©es CSV de maniĂšre fiable.
ProblĂšmes Courants des CSV
1. ProblĂšmes d'Encodage
Le problÚme de CSV le plus frustrant est l'encodage. Un fichier créé sous Windows dans Excel pourrait utiliser windows-1252, tandis que votre script Python attend utf-8.
SymptĂŽmes : CaractĂšres illisibles (mojibake) comme Ă© au lieu de Ă©, ou des exceptions UnicodeDecodeError.
Détection :
import chardet
with open('data.csv', 'rb') as f:
result = chardet.detect(f.read(10000))
print(result) # {'encoding': 'Windows-1252', 'confidence': 0.73}
Correction : Lisez avec l'encodage détecté, puis sauvegardez en 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. Délimiteurs Incohérents
Tous les « CSV » n'utilisent pas des virgules. Les fichiers CSV européens utilisent souvent des points-virgules car les virgules sont des séparateurs décimaux dans de nombreuses langues européennes.
# Auto-détection du délimiteur
import csv
with open('data.csv', 'r') as f:
dialect = csv.Sniffer().sniff(f.read(5000))
print(f"Délimiteur : {repr(dialect.delimiter)}")
Notre Ăditeur CSV gĂšre automatiquement la dĂ©tection des dĂ©limiteurs â collez vos donnĂ©es et il identifie le format.
3. Valeurs Manquantes
Les données manquantes apparaissent sous de nombreuses formes : cellules vides, NA, N/A, null, -, ou simplement des espaces.
# Standardiser toutes les représentations de valeurs manquantes
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', '-', '', ' '])
# Vérifier les valeurs manquantes par colonne
print(df.isnull().sum())
# Stratégie 1 : Supprimer les lignes avec des champs critiques manquants
df = df.dropna(subset=['email', 'name'])
# Stratégie 2 : Remplir avec des valeurs par défaut
df['country'] = df['country'].fillna('Unknown')
# Stratégie 3 : Remplissage vers l'avant (séries temporelles)
df['price'] = df['price'].ffill()
4. Lignes Dupliquées
Les doublons exacts sont faciles Ă trouver. Les doublons approximatifs (mĂȘme personne avec une orthographe lĂ©gĂšrement diffĂ©rente du nom) sont plus difficiles.
# Trouver les doublons exacts
duplicates = df[df.duplicated(keep=False)]
print(f"{len(duplicates)} lignes dupliquées trouvées")
# Supprimer les doublons, en gardant la premiĂšre occurrence
df = df.drop_duplicates()
# Supprimer les doublons basés sur des colonnes spécifiques
df = df.drop_duplicates(subset=['email'], keep='last')
5. Formats de Données Incohérents
Dates en formats mixtes, numéros de téléphone avec et sans indicatif pays, capitalisation incohérente :
# Standardiser les dates
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)
# Standardiser les champs texte
df['name'] = df['name'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()
# Standardiser les numéros de téléphone (basique)
df['phone'] = df['phone'].str.replace(r'[^0-9+]', '', regex=True)
6. ProblÚmes de Types de Données
CSV stocke tout sous forme de texte. Les nombres avec des zéros initiaux, les codes postaux et les numéros de téléphone peuvent perdre leur formatage lors de l'analyse :
# Préserver les zéros initiaux dans les codes postaux
df = pd.read_csv('data.csv', dtype={'zip_code': str, 'phone': str})
# Convertir les chaßnes monétaires en nombres
df['price'] = df['price'].str.replace('$', '').str.replace(',', '').astype(float)
Validation AprĂšs Nettoyage
Validez toujours vos données nettoyées :
# Vérifier le nombre de lignes (avons-nous perdu ou gagné des lignes de maniÚre inattendue ?)
print(f"Lignes : {len(df)}")
# Vérifier les types de données
print(df.dtypes)
# Vérifier les plages de valeurs
print(df.describe())
# Vérifier les nulls restants
print(df.isnull().sum())
# Valider les contraintes d'unicité
assert df['email'].is_unique, "Emails dupliqués trouvés !"
Outils en Ligne de Commande
Pour un nettoyage rapide sans écrire de code :
# Convertir l'encodage
iconv -f WINDOWS-1252 -t UTF-8 input.csv > output.csv
# Trier et supprimer les lignes dupliquées
sort -u input.csv > output.csv
# Extraire des colonnes spécifiques (cut)
cut -d',' -f1,3,5 input.csv > output.csv
# Filtrer les lignes (awk)
awk -F',' '$3 > 100' input.csv > filtered.csv
Pour des transformations plus complexes, des outils comme csvkit fournissent une suite complĂšte d'utilitaires CSV :
# Installer
pip install csvkit
# Voir les noms de colonnes
csvcut -n data.csv
# Filtrer les lignes
csvgrep -c country -m "USA" data.csv > usa_only.csv
# Convertir en JSON
csvjson data.csv > data.json
Vous souhaitez convertir entre CSV et JSON ? Notre convertisseur CSV vers JSON gÚre cela instantanément.
FAQ
Quelle est la taille maximale de fichier pour le traitement CSV ?
Il n'y a pas de limite inhérente dans le format CSV. La limite pratique dépend de vos outils : Excel gÚre environ 1 million de lignes, pandas fonctionne bien jusqu'à plusieurs Go avec suffisamment de RAM, et des outils comme Dask ou Polars gÚrent des ensembles de données plus grands que la mémoire. Pour les outils dans le navigateur, notre éditeur CSV gÚre des fichiers jusqu'à 100 Mo.
Dois-je utiliser CSV ou JSON pour l'échange de données ?
CSV est idéal pour les données tabulaires plates (feuilles de calcul, exports de bases de données, listes simples). JSON est meilleur pour les données imbriquées et hiérarchiques (réponses API, configuration, documents à structure variable). Pour une comparaison détaillée, consultez notre guide CSV vs JSON vs XML.
Ressources Connexes
- Ăditeur CSV â Ăditez et nettoyez les donnĂ©es CSV dans votre navigateur
- Guide de Conversion CSV vers JSON â Convertissez entre les formats
- Bonnes Pratiques de Formatage JSON â Travaillez avec la sortie JSON