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.
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.
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.
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é.
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