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")
