Les bases de GroupBy
Diviser les données en groupes et calculer des synthèses avec le schéma split-apply-combine via groupby().
- Comprendre le schéma split-apply-combine
- Grouper les données par une ou plusieurs colonnes avec groupby()
- Appliquer des agrégations comme mean(), sum(), count() et describe()
- Utiliser agg() pour plusieurs agrégations à la fois
Le schéma split-apply-combine
GroupBy est l’une des fonctionnalités les plus puissantes de pandas. Il suit un schéma en trois étapes :
- Split (diviser), répartir le DataFrame en groupes en fonction d’une ou plusieurs colonnes
- Apply (appliquer), calculer une fonction sur chaque groupe indépendamment
- Combine (combiner), fusionner les résultats en un seul DataFrame
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")Grouper par une colonne unique
# Average survival rate by passenger class
print(df.groupby("Pclass")["Survived"].mean())Sortie :
Pclass
1 0.629630
2 0.472826
3 0.242363
Name: Survived, dtype: float64
Les passagers de première classe avaient un taux de survie de 63 %, contre 24 % pour la troisième classe. Groupby a révélé une différence de classe flagrante en quelques secondes.
Ce qui se passe étape par étape :
# This is conceptually what groupby does:
for pclass, group_df in df.groupby("Pclass"):
print(f"Class {pclass}: {group_df['Survived'].mean():.3f}")Grouper par plusieurs colonnes
# Survival rate by class and sex
print(df.groupby(["Pclass", "Sex"])["Survived"].mean())Sortie :
Pclass Sex
1 female 0.968085
male 0.368852
2 female 0.921053
male 0.157407
3 female 0.500000
male 0.135447
Name: Survived, dtype: float64
Utilisez unstack() pour rendre cela plus lisible :
print(df.groupby(["Pclass", "Sex"])["Survived"].mean().unstack())Méthodes d’agrégation
Groupby prend en charge toutes les agrégations standard :
# Mean fare by class
print(df.groupby("Pclass")["Fare"].mean())
# Total fare collected per class
print(df.groupby("Pclass")["Fare"].sum())
# Count of passengers per class
print(df.groupby("Pclass")["PassengerId"].count())Plusieurs agrégations avec agg()
La méthode agg() applique plusieurs fonctions à la fois :
print(df.groupby("Pclass")["Fare"].agg(["mean", "median", "min", "max", "count"]))Sortie :
mean median min max count
Pclass
1 84.154687 60.287 0.0000 512.3292 216
2 20.662183 19.575 0.0000 73.5000 184
3 13.675550 8.050 0.0000 56.4958 491
Différentes agrégations par colonne :
print(df.groupby("Pclass").agg({
"Survived": "mean",
"Fare": ["mean", "max"],
"Age": "median",
"Name": "count"
}))Agréger toutes les colonnes numériques
# Quick summary of all numeric columns per group
print(df.groupby("Pclass").mean(numeric_only=True))GroupBy avec des filtres
Après le regroupement, vous pouvez filtrer des groupes entiers :
# Keep only groups with more than 50 passengers
large_groups = df.groupby("Pclass").filter(lambda x: len(x) > 50)
print(large_groups["Pclass"].value_counts())Essayez-le
À l’aide du jeu de données Titanic, calculez :
- Le tarif moyen pour chaque port d’embarquement
- Le taux de survie pour chaque combinaison de sexe et de port d’embarquement
- Les statistiques d’âge (moyenne, médiane, min, max) pour chaque classe de passagers
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")
print("Average fare by port:")
print(df.groupby("Embarked")["Fare"].mean())
print("\nSurvival by sex and port:")
print(df.groupby(["Sex", "Embarked"])["Survived"].mean().unstack())
print("\nAge stats by class:")
print(df.groupby("Pclass")["Age"].agg(["mean", "median", "min", "max"]))Points clés à retenir
- GroupBy suit le schéma split-apply-combine : diviser les données, appliquer une fonction, combiner les résultats
- Groupez par une colonne pour des synthèses simples, par plusieurs colonnes pour une analyse plus approfondie
agg()permet de calculer plusieurs statistiques à la fois, par colonne si besoin- Groupby révèle des schémas invisibles dans les données brutes
Défi pratique
À partir du jeu de données Titanic, calculez le taux de survie pour chaque combinaison de Pclass, Sex et le fait que le passager voyageait seul (SibSp + Parch == 0). Quel groupe a enregistré le taux de survie le plus élevé ? Lequel le plus faible ?
1. Que fait df.groupby('col') ?
2. Comment calculer la moyenne de chaque groupe ?
3. Que renvoie df.groupby('col').size() ?