ParcoursOuvrir l'appli

Nettoyer avec pandas

Données : NumPy et pandas · 50 min

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
É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 :

  1. produits sans espaces et en minuscules, vendeurs sans espaces ;
  2. quantite et prix_unitaire convertis en nombres (1 200 devient 1200, deux devient NaN) ;
  3. lignes incomplètes enlevées, quantité et prix remis en entiers ;
  4. une colonne montant, et ca le 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") ?
  1. Une erreur, à cause de « trois »
  2. 3, 5, NaN, NaN (bonne réponse)
  3. 3, 5, 0, 3
  4. 3, 5, 0, 0