Opérations GroupBy de Pandas (groupby)
groupbyC'est l'une des fonctionnalités les plus puissantes de Pandas ; elle vous permet de regrouper les données par une ou plusieurs colonnes, puis d'effectuer des opérations d'agrégation, de transformation ou de filtrage sur chaque groupe.
Utilisation de base de groupby
Regroupement par une seule colonne
Exemple
import pandas as pd
# Créer des données d'exemple
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations", "Ventes", "Technologie"],
"Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi", "Sun Ba"],
"Salaire": [12000, 15000, 11000, 18000, 14000, 13000]
})
print("Données d'origine :")
print(df)
print()
# Grouper par département
grouped = df.groupby("Department")
print(f"Objet groupé : {type(grouped)}")
print(f"Nombre de groupes : {len(grouped)}")
print()
# Afficher les groupes
print("Données pour chaque groupe :")
for name, group in grouped:
print(f"\nDépartement : {name}")
print(group)
# Créer des données d'exemple
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations", "Ventes", "Technologie"],
"Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi", "Sun Ba"],
"Salaire": [12000, 15000, 11000, 18000, 14000, 13000]
})
print("Données d'origine :")
print(df)
print()
# Grouper par département
grouped = df.groupby("Department")
print(f"Objet groupé : {type(grouped)}")
print(f"Nombre de groupes : {len(grouped)}")
print()
# Afficher les groupes
print("Données pour chaque groupe :")
for name, group in grouped:
print(f"\nDépartement : {name}")
print(group)
Regroupement et agrégation
Exemple
import pandas as pd
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations", "Ventes"],
"Salaire": [12000, 15000, 11000, 18000, 14000]
})
print("Salaire moyen par département :")
print(df.groupby("Department")["Salary"].mean())
print()
print("Somme par département :")
print(df.groupby("Department")["Salary"].sum())
print()
print("Nombre par département :")
print(df.groupby("Department").size())
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations", "Ventes"],
"Salaire": [12000, 15000, 11000, 18000, 14000]
})
print("Salaire moyen par département :")
print(df.groupby("Department")["Salary"].mean())
print()
print("Somme par département :")
print(df.groupby("Department")["Salary"].sum())
print()
print("Nombre par département :")
print(df.groupby("Department").size())
Regroupement par plusieurs colonnes
Exemple
import pandas as pd
df = pd.DataFrame({
"Year": ["2023", "2023", "2024", "2024"],
"Département": ["Technologie", "Ventes", "Technologie", "Ventes"],
"Salaire": [12000, 15000, 13000, 16000]
})
print("Regrouper par année et département :")
print(df.groupby(["Year", "Department"])["Salary"].sum())
print()
# Résultat sous forme de DataFrame
result = df.groupby(["Year", "Department"]).agg({
"Salary": "sum"
}).reset_index()
print("DataFrame de résultat :")
print(result)
df = pd.DataFrame({
"Year": ["2023", "2023", "2024", "2024"],
"Département": ["Technologie", "Ventes", "Technologie", "Ventes"],
"Salaire": [12000, 15000, 13000, 16000]
})
print("Regrouper par année et département :")
print(df.groupby(["Year", "Department"])["Salary"].sum())
print()
# Résultat sous forme de DataFrame
result = df.groupby(["Year", "Department"]).agg({
"Salary": "sum"
}).reset_index()
print("DataFrame de résultat :")
print(result)
Fonctions d'agrégation courantes
Agrégation simple
| Fonction | Description |
|---|---|
sum() |
Sum |
mean() |
Moyenne |
median() |
Médiane |
std() |
Écart-type |
min() / max() |
Min/Max |
count() |
Count |
first() / last() |
Première/Dernière valeur |
Exemple
import pandas as pd
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations"],
"Salaire": [12000, 15000, 11000, 18000]
})
# Enchaîner plusieurs agrégations
print("Agrégation chaînée :")
print(df.groupby("Department")["Salary"].agg(["sum", "mean", "max", "min"]))
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations"],
"Salaire": [12000, 15000, 11000, 18000]
})
# Enchaîner plusieurs agrégations
print("Agrégation chaînée :")
print(df.groupby("Department")["Salary"].agg(["sum", "mean", "max", "min"]))
Agrégation personnalisée
Exemple
import pandas as pd
import numpy as np
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations"],
"Salaire": [12000, 15000, 11000, 18000]
})
# Fonction d'agrégation personnalisée
def range_func(x):
return x.max() - x.min()
print("Utilisation d'une fonction personnalisée :")
print(df.groupby("Department")["Salary"].agg(range_func))
print()
# Agrégation nommée (recommandée)
print("Agrégation nommée :")
print(df.groupby("Department").agg(
Salaire minimum=("Salary", "min"),
Salaire maximum=("Salary", "max"),
Salaire moyen=("Salary", "mean")
))
import numpy as np
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations"],
"Salaire": [12000, 15000, 11000, 18000]
})
# Fonction d'agrégation personnalisée
def range_func(x):
return x.max() - x.min()
print("Utilisation d'une fonction personnalisée :")
print(df.groupby("Department")["Salary"].agg(range_func))
print()
# Agrégation nommée (recommandée)
print("Agrégation nommée :")
print(df.groupby("Department").agg(
Salaire minimum=("Salary", "min"),
Salaire maximum=("Salary", "max"),
Salaire moyen=("Salary", "mean")
))
transform
transform peut calculer sur chaque groupe tout en conservant la forme d'origine des données, et renvoyer un résultat de même forme que les données d'origine.
Exemple
import pandas as pd
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations", "Ventes"],
"Salaire": [12000, 15000, 11000, 18000, 14000]
})
print("Données d'origine :")
print(df)
print()
# Calculer le salaire moyen pour chaque département et le diffuser à chaque ligne
df["Department average salary"] = df.groupby("Department")["Salary"].transform("mean")
print("Après avoir ajouté le salaire moyen du département :")
print(df)
print()
# Calculer le salaire de chaque personne en pourcentage du département
df["Salary percentage"] = df["Salary"] / df["Department average salary"]
print("Proportion du salaire :")
print(df)
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations", "Ventes"],
"Salaire": [12000, 15000, 11000, 18000, 14000]
})
print("Données d'origine :")
print(df)
print()
# Calculer le salaire moyen pour chaque département et le diffuser à chaque ligne
df["Department average salary"] = df.groupby("Department")["Salary"].transform("mean")
print("Après avoir ajouté le salaire moyen du département :")
print(df)
print()
# Calculer le salaire de chaque personne en pourcentage du département
df["Salary percentage"] = df["Salary"] / df["Department average salary"]
print("Proportion du salaire :")
print(df)
filter Filtrage
filter peut filtrer les données en fonction de conditions de groupe.
Exemple
import pandas as pd
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations", "Ventes", "Technologie"],
"Salaire": [12000, 15000, 11000, 18000, 14000, 13000]
})
print("Données d'origine :")
print(df)
print()
# Filtrer les départements dont le salaire moyen est supérieur à 13000
print("Salaire moyen du département > 13000 :")
filtered = df.groupby("Department").filter(lambda x: x["Salary"].mean() > 13000)
print(filtered)
print()
# Filtrer les groupes avec un nombre supérieur à 2
print("Nombre de membres > 2 :")
filtered2 = df.groupby("Department").filter(lambda x: len(x) > 2)
print(filtered2)
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations", "Ventes", "Technologie"],
"Salaire": [12000, 15000, 11000, 18000, 14000, 13000]
})
print("Données d'origine :")
print(df)
print()
# Filtrer les départements dont le salaire moyen est supérieur à 13000
print("Salaire moyen du département > 13000 :")
filtered = df.groupby("Department").filter(lambda x: x["Salary"].mean() > 13000)
print(filtered)
print()
# Filtrer les groupes avec un nombre supérieur à 2
print("Nombre de membres > 2 :")
filtered2 = df.groupby("Department").filter(lambda x: len(x) > 2)
print(filtered2)
apply Fonctions personnalisées
apply permet d'appliquer des fonctions personnalisées à chaque groupe.
Exemple
import pandas as pd
import numpy as np
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations"],
"Salaire": [12000, 15000, 11000, 18000]
})
# Appliquer une fonction personnalisée à chaque groupe
result = df.groupby("Department").apply(
lambda x: pd.Series({
"Somme": x["Salaire"].sum(),
"Moyenne": x["Salaire"].mean()
})
)
print("Résultat d'agrégation personnalisé :")
print(result)
import numpy as np
df = pd.DataFrame({
"Département": ["Technologie", "Ventes", "Technologie", "Opérations"],
"Salaire": [12000, 15000, 11000, 18000]
})
# Appliquer une fonction personnalisée à chaque groupe
result = df.groupby("Department").apply(
lambda x: pd.Series({
"Somme": x["Salaire"].sum(),
"Moyenne": x["Salaire"].mean()
})
)
print("Résultat d'agrégation personnalisé :")
print(result)
Travaux pratiques : Analyse des données de ventes
Exemple
import pandas as pd
# Simuler des données de ventes
sales = pd.DataFrame({
"Date": pd.date_range("2024-01-01", periods=30, freq="D"),
"Produit": ["Mobile", "Ordinateur", "Tablette"] * 10,
"Canal": ["En ligne"] * 15 + ["Hors ligne"] * 15,
"Montant des ventes": [1000, 2000, 1500] * 10
})
print("=== Analyse des données de ventes ==="\n")
# 1. Statistiques par produit
print("1. Statistiques par produit :")
product_summary = sales.groupby("Produit")["Montant des ventes"].agg(["sum", "mean", "count"])
print(product_summary)
print()
# 2. Statistiques par canal
print("2. Statistiques par canal :")
channel_summary = sales.groupby("Channel")["Sales amount"].sum()
print(channel_summary)
print()
# 3. Statistiques croisées par produit et canal
print("3. Statistiques croisées produit × canal :")
cross_summary = sales.groupby(["Product", "Channel"])["Sales amount"].sum().unstack()
print(cross_summary)
print()
# 4. Calculer la proportion des ventes pour chaque produit
print("4. Proportion des ventes :")
total = sales["Sales amount"].sum()
product_pct = sales.groupby("Product")["Sales amount"].sum() / total * 100
print(product_pct.round(2))
# Simuler des données de ventes
sales = pd.DataFrame({
"Date": pd.date_range("2024-01-01", periods=30, freq="D"),
"Produit": ["Mobile", "Ordinateur", "Tablette"] * 10,
"Canal": ["En ligne"] * 15 + ["Hors ligne"] * 15,
"Montant des ventes": [1000, 2000, 1500] * 10
})
print("=== Analyse des données de ventes ==="\n")
# 1. Statistiques par produit
print("1. Statistiques par produit :")
product_summary = sales.groupby("Produit")["Montant des ventes"].agg(["sum", "mean", "count"])
print(product_summary)
print()
# 2. Statistiques par canal
print("2. Statistiques par canal :")
channel_summary = sales.groupby("Channel")["Sales amount"].sum()
print(channel_summary)
print()
# 3. Statistiques croisées par produit et canal
print("3. Statistiques croisées produit × canal :")
cross_summary = sales.groupby(["Product", "Channel"])["Sales amount"].sum().unstack()
print(cross_summary)
print()
# 4. Calculer la proportion des ventes pour chaque produit
print("4. Proportion des ventes :")
total = sales["Sales amount"].sum()
product_pct = sales.groupby("Product")["Sales amount"].sum() / total * 100
print(product_pct.round(2))
Autres extensionsgroupby est une opération essentielle dans l'analyse de données ; le maîtriser vous permet d'accomplir efficacement diverses tâches d'analyse statistique.