Nettoyer avec pandas
Les valeurs manquantes : NaN
Que fait pandas avec le fichier d'avril, celui du neveu fatigué ? Il le lit sans planter. Mais regarde ce qu'il en fait :
date produit quantite prix_unitaire vendeur
0 2026-04-01 riz 2 1200 Awa
1 2026-04-01 Huile 1 1500 Paul
2 2026-04-02 SAVON 4 500 Mireille
3 2026-04-03 riz NaN 1200 Paul
4 2026-04-03 sucre 3 900 Awa
5 2026-04-04 riz 1 1 200 Mireille
6 2026-04-05 lait deux 650 Paul
7 2026-04-05 huile 2 1500 NaN
8 2026-04-06 Spaghetti 5 400 Awa
9 2026-04-07 riz 10 1200 Paul
- la ligne vide a disparu : pandas les saute par défaut ;
- la quantité vide et le vendeur absent sont devenus NaN ;
quantiteetprix_unitairesont du texte (typeobject), à cause dedeuxet de1 200: une seule valeur qui n'est pas un nombre suffit pour que toute la colonne reste du texte ;- les espaces et les majuscules sont toujours là.
| Écriture | Effet |
|---|---|
df.isna() |
un tableau de True là où il manque une valeur |
df.isna().sum() |
le nombre de valeurs manquantes par colonne |
df.dropna() |
enlève les lignes qui ont au moins un NaN |
df.dropna(subset=["quantite"]) |
enlève seulement les lignes sans quantité |
df["ville"].fillna("Inconnue") |
remplace les NaN par une valeur choisie |
Nettoyer une colonne entière
Les méthodes de texte que tu connais (strip, lower, replace) existent pour des colonnes entières, derrière le mot .str :
df["produit"] = df["produit"].str.strip().str.lower()
Pour les nombres écrits n'importe comment, pandas a l'équivalent de ta fonction convertir :
texte = df["prix_unitaire"].astype(str).str.replace(" ", "")
df["prix_unitaire"] = pd.to_numeric(texte, errors="coerce")
Après la conversion, il ne reste qu'à enlever les lignes incomplètes avec dropna(), puis à remettre les colonnes en entiers avec .astype(int) : NaN étant un nombre décimal, une colonne qui en contenait est devenue float64.
Les doublons
Voir le nettoyage étape par étape
Lance, puis ajoute des print(df) entre les étapes pour voir chaque transformation.
import pandas as pd
df = pd.read_csv("ventes_brutes.csv")
print("Valeurs manquantes par colonne :")
print(df.isna().sum())
print()
print("Types :")
print(df.dtypes)
Exercice : Le fichier d'avril, version pandas
Nettoie ventes_brutes.csv pour obtenir exactement les 7 ventes valables du projet :
- produits sans espaces et en minuscules, vendeurs sans espaces ;
quantiteetprix_unitaireconvertis en nombres (1 200devient 1200,deuxdevient NaN) ;- lignes incomplètes enlevées, quantité et prix remis en entiers ;
- une colonne
montant, etcale chiffre d'affaires.
Voir une solution
import pandas as pd
df = pd.read_csv("ventes_brutes.csv")
df["produit"] = df["produit"].str.strip().str.lower()
df["vendeur"] = df["vendeur"].str.strip()
for col in ["quantite", "prix_unitaire"]:
df[col] = pd.to_numeric(df[col].astype(str).str.replace(" ", ""), errors="coerce")
df = df.dropna()
df["quantite"] = df["quantite"].astype(int)
df["prix_unitaire"] = df["prix_unitaire"].astype(int)
df["montant"] = df["quantite"] * df["prix_unitaire"]
ca = df["montant"].sum()
print(df)
print("Chiffre d'affaires :", ca)Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Exercice : Les inscriptions en double
Un lycée a exporté sa liste d'inscriptions à un concours, mais certains élèves ont été saisis plusieurs fois. Calcule :
nb_doublons: le nombre de lignes en double ;propre: le DataFrame sans doublons ;par_classe: un dictionnaire qui donne le nombre d'élèves uniques par classe.
Voir une solution
import pandas as pd
df = pd.read_csv("inscrits.csv")
nb_doublons = df.duplicated().sum()
propre = df.drop_duplicates()
par_classe = propre["classe"].value_counts().to_dict()
print(nb_doublons, len(propre), par_classe)Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Teste-toi
Une colonne quantite contient "3", "5", "" et "trois". Que donne pd.to_numeric(df["quantite"], errors="coerce") ?
- Une erreur, à cause de « trois »
3, 5, NaN, NaN(bonne réponse)3, 5, 0, 33, 5, 0, 0