logo oujood
🔍

Grouper des données avec groupby

groupby() est l'une des méthodes les plus puissantes de Pandas. Elle permet de regrouper les lignes selon une ou plusieurs colonnes, puis d'appliquer des calculs sur chaque groupe. C'est l'équivalent du GROUP BY en SQL.

OUJOOD.COM

Comment fonctionne groupby()

L'idée derrière groupby() est simple : vous divisez le DataFrame en groupes selon les valeurs d'une colonne, puis vous appliquez une fonction de calcul sur chaque groupe. Le résultat est un nouveau DataFrame résumé.

Trois étapes se passent en coulisse : split (diviser en groupes), apply (appliquer une fonction), combine (réassembler les résultats). Vous n'avez pas à gérer ces étapes manuellement — groupby() s'en charge.

Agrégations simples avec groupby()

Les fonctions les plus courantes après un groupby() : sum(), mean(), count(), min(), max(). Elles s'enchaînent directement après le groupement.

  📋 Copier le code

import pandas as pd

data = {
    "vendeur":    ["Alice", "Bob", "Alice", "Clara", "Bob", "Clara", "Alice"],
    "produit":    ["Clavier", "Souris", "Écran", "Clavier", "Écran", "Souris", "Souris"],
    "quantité":   [2, 5, 1, 3, 2, 4, 6],
    "montant":    [91.8, 112.5, 189.0, 137.7, 378.0, 90.0, 135.0]
}
df = pd.DataFrame(data)

# Total des ventes par vendeur
print(df.groupby("vendeur")["montant"].sum())

# Quantité moyenne par produit
print(df.groupby("produit")["quantité"].mean())

# Nombre de transactions par vendeur
print(df.groupby("vendeur")["montant"].count())

Le résultat de groupby() + agrégation est une Series indexée par les valeurs du groupe. Pour récupérer un DataFrame avec le groupe comme colonne normale (et non comme index), ajoutez .reset_index() à la fin.

Grouper sur plusieurs colonnes

Vous pouvez grouper sur plusieurs colonnes à la fois en passant une liste. L'index du résultat devient alors un MultiIndex.

  📋 Copier le code

import pandas as pd

data = {
    "vendeur":  ["Alice", "Bob", "Alice", "Clara", "Bob", "Clara", "Alice"],
    "produit":  ["Clavier", "Souris", "Écran", "Clavier", "Écran", "Souris", "Souris"],
    "quantité": [2, 5, 1, 3, 2, 4, 6],
    "montant":  [91.8, 112.5, 189.0, 137.7, 378.0, 90.0, 135.0]
}
df = pd.DataFrame(data)

# Total par vendeur ET par produit
resultat = df.groupby(["vendeur", "produit"])["montant"].sum()
print(resultat)

# Transformer en DataFrame plat avec reset_index()
df_resume = df.groupby(["vendeur", "produit"])["montant"].sum().reset_index()
print(df_resume)

reset_index() aplatit le MultiIndex en colonnes normales — le résultat ressemble à un tableau habituel, plus facile à manipuler ensuite. C'est le réflexe à avoir après presque tout groupby() que vous allez réutiliser dans une analyse.

Appliquer plusieurs fonctions avec agg()

agg() (abréviation de aggregate) permet d'appliquer plusieurs fonctions en une seule passe et de nommer les colonnes résultantes proprement.

  📋 Copier le code

import pandas as pd

data = {
    "vendeur":  ["Alice", "Bob", "Alice", "Clara", "Bob", "Clara", "Alice"],
    "quantité": [2, 5, 1, 3, 2, 4, 6],
    "montant":  [91.8, 112.5, 189.0, 137.7, 378.0, 90.0, 135.0]
}
df = pd.DataFrame(data)

# Plusieurs statistiques par vendeur en une passe
resume = df.groupby("vendeur").agg(
    total_ventes  = ("montant",  "sum"),
    vente_moyenne = ("montant",  "mean"),
    nb_commandes  = ("montant",  "count"),
    qte_totale    = ("quantité", "sum")
).reset_index()

print(resume)

La syntaxe nom_colonne = ("colonne_source", "fonction") est appelée named aggregation. Elle produit directement des noms de colonnes lisibles dans le résultat, sans renommage supplémentaire. C'est la forme à préférer pour tout résumé destiné à être partagé ou visualisé.

Filtrer après un groupby avec filter()

filter() appliqué à un groupe permet de garder ou supprimer des groupes entiers selon une condition. Il retourne les lignes originales, pas un résumé.

  📋 Copier le code

import pandas as pd

data = {
    "vendeur":  ["Alice", "Bob", "Alice", "Clara", "Bob", "Clara", "Alice"],
    "montant":  [91.8, 112.5, 189.0, 137.7, 378.0, 90.0, 135.0]
}
df = pd.DataFrame(data)

# Garder seulement les vendeurs dont le total dépasse 300 €
df_actifs = df.groupby("vendeur").filter(lambda g: g["montant"].sum() > 300)
print(df_actifs)

La lambda reçoit chaque groupe sous forme de DataFrame (g) et retourne True si le groupe doit être conservé. Toutes les lignes des groupes retenus sont incluses dans le résultat — pas une agrégation, mais un filtre sur les groupes. C'est utile pour éliminer les petits groupes peu représentatifs avant une analyse.

Par carabde | Mis à jour le 26 avril 2026