Exercice 68 / 100

Pandas — GroupBy

ConsigneAgrège des données avec groupby()

📖 Cours

groupby est l'opération la plus puissante de pandas. Modèle split-apply-combine :

SPLIT : regrouper les lignes par valeur(s) d'une (ou plusieurs) colonne(s)APPLY : appliquer une fonction (mean, sum, custom...) à chaque groupeCOMBINE : assembler le résultat

Forme de base

df.groupby('dept')['salaire'].mean()

Renvoie une Series indexée par les valeurs de 'dept'.

groupby ne calcule rien tout seul : il découpe les lignes par valeur, attend l'agrégation qui s'applique à l'intérieur de chaque groupe, puis assemble les résultats en un seul objet
groupby ne calcule rien tout seul : il découpe les lignes par valeur, attend l'agrégation qui s'applique à l'intérieur de chaque groupe, puis assemble les résultats en un seul objet

Agrégations courantes

.sum() .mean() .median() .std() .var().min() .max() .count() .size().first() .last() .nunique()
.agg('mean')
équivalent

Différence count vs size :

count : nb de valeurs NON-nullessize : nb total de lignes (NaN inclus)

Plusieurs agrégations

# Plusieurs fonctions sur une colonnedf.groupby('dept')['salaire'].agg(['mean', 'min', 'max'])
# Différentes fonctions par colonnedf.groupby('dept').agg({'salaire': ['mean', 'max'], 'bonus': 'sum'})
# Renommer le résultat (named aggregation)df.groupby('dept').agg( salaire_moyen=('salaire', 'mean'), bonus_total=('bonus', 'sum'),)

Groupby multiple

df.groupby(['dept', 'ville'])['salaire'].mean()# → Series avec MultiIndex (dept, ville)
.unstack()
transforme un niveau d'index en colonnes (pratique pour visualiser)

Reset_index pour récupérer un DataFrame plat

df.groupby('dept')['salaire'].mean().reset_index()# → DataFrame avec 2 colonnes (dept, salaire) au lieu d'une Series

Exemple complet

df = pd.DataFrame({ 'dept': ['Tech','RH','Tech','Finance','RH','Tech'], 'salaire': [55000, 42000, 62000, 58000, 45000, 47000], 'bonus': [5000, 3000, 7000, 4000, 3500, 4500]})
print(df.groupby('dept')['salaire'].mean())# dept# Finance 58000.0# RH 43500.0# Tech 54666.6...
print(df.groupby('dept').agg({'salaire': ['mean', 'max'], 'bonus': 'sum'}))

groupby est paresseux : groupby() ne calcule rien tant qu'on n'appelle pas une agrégation. Cela permet d'enchaîner des opérations efficacement.

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →