← Guides

Nettoyer un fichier CSV désordonné avec Python Pandas (pas à pas)

Encodage cassé, dates mélangées, doublons et nombres stockés en texte : un script Pandas reproductible adaptable à n'importe quel export.

Python · 10 min de lecture

Charger le fichier sans perte

Les exports comptables ou CRM sont souvent en Windows-1252 avec des points-virgules. Précisez séparateur et encodage, et lisez tout en texte pour éviter les conversions prématurées.

import pandas as pd

df = pd.read_csv("export.csv", sep=";", encoding="cp1252", dtype=str)
print(df.shape)

Normaliser les noms de colonnes

Espaces, majuscules et accents rendent le code fragile. Convertissez une fois pour toutes en snake_case.

df.columns = (
    df.columns.str.strip().str.lower()
    .str.normalize("NFKD").str.encode("ascii", "ignore").str.decode("ascii")
    .str.replace(r"[^a-z0-9]+", "_", regex=True)
)

Corriger les nombres en texte

Les exports français écrivent 1 234,56. Supprimez les séparateurs de milliers, remplacez la virgule, puis convertissez avec errors="coerce". Comptez les NaN produits : un pic signale une mauvaise hypothèse de format.

df["montant"] = pd.to_numeric(
    df["montant"].str.replace("\u00a0", "").str.replace(" ", "").str.replace(",", "."),
    errors="coerce",
)

Analyser les dates de façon cohérente

Les formats mélangés sont dangereux car une mauvaise lecture semble valide. Utilisez dayfirst=True et contrôlez les dates min et max.

df["date"] = pd.to_datetime(df["date"], dayfirst=True, errors="coerce")
print(df["date"].min(), df["date"].max())

Supprimer doublons et lignes vides

Définissez la clé d'unicité (numéro de facture) avant de dédoublonner, et nettoyez les espaces au préalable.

cols = df.select_dtypes("object").columns
df[cols] = df[cols].apply(lambda s: s.str.strip())
df = df.dropna(how="all").drop_duplicates(subset=["numero_facture"])

Exporter et documenter

Exportez en UTF-8 avec BOM pour Excel et notez le nombre de lignes retirées à chaque étape : le nettoyage devient auditable. Décrivez votre fichier dans FormulAI pour obtenir un script adapté à vos colonnes.

df.to_csv("export_propre.csv", index=False, encoding="utf-8-sig")