ParcoursOuvrir l'appli

Grouper et résumer

Données : NumPy et pandas · 50 min

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.

  1. Construis tableau : le tableau croisé du chiffre d'affaires par mois (lignes) et par vendeur (colonnes), avec groupby sur deux colonnes et .unstack().
  2. 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"].
  3. 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