Skip to content

pandas : manipuler des tables de données

Là où NumPy manipule des tableaux de nombres, pandas manipule des tables étiquetées : chaque colonne a un nom, chaque ligne peut avoir un index explicite. C’est l’outil que vous utiliserez pour 80 % du travail de préparation de données de ce cours.

import pandas as pd
ventes = pd.DataFrame({
"date": pd.to_datetime([
"2026-06-01", "2026-06-01", "2026-06-02", "2026-06-02",
"2026-06-03", "2026-06-03", "2026-06-04",
]),
"region": ["Nord", "Sud", "Nord", "Sud", "Nord", "Sud", "Nord"],
"produit": ["A", "B", "A", "A", "B", "B", "A"],
"montant": [120.0, 85.0, 95.0, 60.0, 140.0, 75.0, 110.0],
})
print(ventes)
date region produit montant
0 2026-06-01 Nord A 120.0
1 2026-06-01 Sud B 85.0
2 2026-06-02 Nord A 95.0
3 2026-06-02 Sud A 60.0
4 2026-06-03 Nord B 140.0
5 2026-06-03 Sud B 75.0
6 2026-06-04 Nord A 110.0

pd.to_datetime convertit des chaînes de caractères en un type date exploitable (indispensable dès qu’on trie ou groupe par période — voir le module 8 sur les séries temporelles).

Le filtrage pandas reprend directement l’indexation booléenne de NumPy, appliquée aux lignes d’une table :

print(ventes[ventes["region"] == "Nord"])
print(ventes[ventes["montant"] > 100])
date region produit montant
0 2026-06-01 Nord A 120.0
2 2026-06-02 Nord A 95.0
4 2026-06-03 Nord B 140.0
6 2026-06-04 Nord A 110.0

groupby : l’opération la plus utilisée en data science

Section titled “groupby : l’opération la plus utilisée en data science”

groupby répond à des questions du type « pour chaque valeur de X, calcule Y » :

par_region = ventes.groupby("region")["montant"].agg(["sum", "mean", "count"])
print(par_region)
sum mean count
region
Nord 465.0 116.250000 4
Sud 220.0 73.333333 3

On peut grouper par plusieurs colonnes à la fois :

print(ventes.groupby(["region", "produit"])["montant"].sum())
region produit
Nord A 325.0
B 140.0
Sud A 60.0
B 160.0
Name: montant, dtype: float64

Séries temporelles : une première moyenne mobile

Section titled “Séries temporelles : une première moyenne mobile”
ventes_par_jour = ventes.groupby("date")["montant"].sum()
print(ventes_par_jour.rolling(2).mean())
date
2026-06-01 NaN
2026-06-02 180.0
2026-06-03 185.0
2026-06-04 162.5
Name: montant, dtype: float64

rolling(2).mean() calcule, pour chaque jour, la moyenne glissante sur lui-même et le jour précédent — d’où le NaN pour le premier jour, qui n’a pas de jour antérieur. Cette notion de fenêtre glissante reviendra en détail au module 8.

print(ventes_incomplete.isna().sum())
ventes_nettoyee = ventes_incomplete.dropna(subset=["montant"])
print("lignes avant/après dropna:", len(ventes_incomplete), "->", len(ventes_nettoyee))
date 0
region 0
produit 0
montant 1
dtype: int64
lignes avant/après dropna: 7 -> 6

isna() repère les valeurs manquantes colonne par colonne ; dropna les élimine. Une alternative — remplacer plutôt que supprimer (fillna) — sera discutée quand elle s’applique réellement, au module 4.

👉 Visualiser des données avec Matplotlib et Seaborn


Junior TSAFACK – 12/09/2026