Dates incohérentes, doublons partiels, valeurs manquantes structurées : le nettoyage n’est pas une liste de méthodes, c’est une suite de choix à poser.
dropna(), fillna(), drop_duplicates() tiennent en une ligne. Le vrai travail est en amont : que signifie une valeur manquante dans cette colonne ? Est-ce une absence d’information, un zéro déguisé, ou une catégorie à part entière ?
Sans répondre à ça, chaque méthode Pandas est une roulette.
Écrivez ces réponses dans le notebook. Le code vient après.
import pandas as pd
df = pd.read_csv("clients.csv", dtype="string")
print(df.shape)
print(df.isna().mean().sort_values(ascending=False).head(15))
print(df.dtypes)dtype="string" (nullable) évite les surprises où un code postal devient un float parce qu’une cellule est vide.
df["code_postal"].str.len().value_counts(dropna=False)Les longueurs aberrantes (3, 6, 10) racontent souvent l’histoire des exports successifs mieux qu’un describe().
df["inscrit_le"] = pd.to_datetime(
df["inscrit_le"],
format="mixed",
dayfirst=True,
errors="coerce",
)errors="coerce" transforme l’impardonnable en NaT — visible, comptable. Parser sans format et sans audit, c’est mélanger des 03/04/2026 américains et européens sans le savoir.
Comptez ensuite :
print(df["inscrit_le"].isna().sum())Si 30 % deviennent NaT, le problème est la source, pas Pandas.
dupes = df[df.duplicated(subset=["email"], keep=False)].sort_values("email")Puis choisissez une règle explicite :
| Situation | Règle possible |
|---|---|
| Même email, dernière ligne la plus récente | keep="last" après tri par date |
| Même email, fusionner les champs non nuls | agrégation custom |
| Même email, lignes contradictoires | quarantaine, pas de suppression |
df = (
df.sort_values("mis_a_jour_le")
.drop_duplicates(subset=["email"], keep="last")
)La ligne qui compte n’est pas drop_duplicates : c’est le tri qui définit laquelle survit.
fit() accepte le tableau — vous inventez du signal.assert df["email"].isna().mean() < 0.01
assert df["email"].is_unique
assert df["inscrit_le"].notna().all()
print(df.shape)Des assertions valent mieux qu’un sentiment de propreté. Si elles cassent au prochain export, vous le saurez immédiatement.
Pandas offre des outils. Le nettoyage, lui, est une politique : quoi garder, quoi jeter, quoi inventer, quoi mettre en quarantaine. Tant que cette politique n’est pas écrite, chaque fillna est une dette déguisée en ligne de code.
Développement et déploiement de solutions de données — les premiers modules sont en accès libre.