Grouper et résumer
groupby : regrouper en une ligne
Ta fonction ca_par(ventes, cle) du projet a un équivalent pandas, et c'est l'une des opérations les plus utilisées au monde en analyse de données.
df.groupby("produit")["montant"].sum()
produit
huile 28500
lait 8450
riz 34800
savon 21000
spaghetti 8800
sucre 40500
Name: montant, dtype: int64
Le résultat est une Series dont l'index est le nom du produit. Les produits sont rangés par ordre alphabétique ; pour classer du plus grand au plus petit, on enchaîne .sort_values(ascending=False).
On lit cette ligne comme une phrase : « regroupe par produit, prends la colonne montant, fais la somme ». On peut remplacer sum par mean (moyenne), count (nombre de lignes), max, min.
| Écriture | Résultat |
|---|---|
s.idxmax() |
l'étiquette de la plus grande valeur : "sucre" |
s.max() |
la plus grande valeur : 40500 |
s.to_dict() |
un dictionnaire Python ordinaire |
Plusieurs résumés d'un coup
df.groupby("vendeur")["montant"].agg(["sum", "count", "mean"])
sum count mean
vendeur
Awa 39150 13 3011.538462
Mireille 38600 12 3216.666667
Paul 64300 17 3782.352941
Les dates et le mois
Pour regrouper par mois, on a besoin d'une colonne mois. Deux méthodes.
La tranche, comme dans le projet, mais sur toute la colonne grâce à .str :
df["mois"] = df["date"].str[:7] # "2026-01", "2026-02"...
Les vraies dates, plus puissantes :
df["date"] = pd.to_datetime(df["date"])
df["jour"] = df["date"].dt.dayofweek
df.groupby("jour")["montant"].sum() # les ventes selon le jour de la semaine
Savoir quel jour de la semaine la boutique vend le plus, c'est savoir quand commander plus de stock et quand ne pas fermer pour aller au marché.
Grouper selon deux colonnes
On peut donner une liste de colonnes à groupby :
df.groupby(["mois", "vendeur"])["montant"].sum()
On obtient le total de chaque vendeur, mois par mois. Pour le voir sous forme de tableau croisé, .unstack() met la deuxième colonne à l'horizontale :
df.groupby(["mois", "vendeur"])["montant"].sum().unstack()
vendeur Awa Mireille Paul
mois
2026-01 12700 10100 29700
2026-02 11250 9900 15600
2026-03 15200 18600 19000
Exercice : Le rapport de Mama Brigitte, version pandas
Refais les indicateurs du projet en pandas. Calcule :
par_produit: la Series du chiffre d'affaires par produit, du plus grand au plus petit ;meilleur_vendeur: le nom du vendeur qui a le plus gros chiffre d'affaires ;par_mois: un dictionnaire du chiffre d'affaires par mois (clés"2026-01"...) ;panier_moyen: le montant moyen d'une vente, arrondi à l'entier.
Voir une solution
import pandas as pd
df = pd.read_csv("ventes.csv")
df["montant"] = df["quantite"] * df["prix_unitaire"]
par_produit = df.groupby("produit")["montant"].sum().sort_values(ascending=False)
meilleur_vendeur = df.groupby("vendeur")["montant"].sum().idxmax()
df["mois"] = df["date"].str[:7]
par_mois = df.groupby("mois")["montant"].sum().to_dict()
panier_moyen = round(df["montant"].mean())
print(par_produit)
print(meilleur_vendeur, par_mois, panier_moyen)Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Exercice : Qui progresse ?
Mama Brigitte veut savoir quel vendeur a le plus progressé entre janvier et mars.
- Construis
tableau: le tableau croisé du chiffre d'affaires par mois (lignes) et par vendeur (colonnes), avecgroupbysur deux colonnes et.unstack(). progression: pour chaque vendeur, le chiffre de mars moins celui de janvier (une Series). Une ligne d'un tableau se lit avec.loc:tableau.loc["2026-03"].plus_progresse: le nom du vendeur dont la progression est la plus forte.
Voir une solution
import pandas as pd
df = pd.read_csv("ventes.csv")
df["montant"] = df["quantite"] * df["prix_unitaire"]
df["mois"] = df["date"].str[:7]
tableau = df.groupby(["mois", "vendeur"])["montant"].sum().unstack()
progression = tableau.loc["2026-03"] - tableau.loc["2026-01"]
plus_progresse = progression.idxmax()
print(tableau)
print(progression)Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice