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)

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())

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)

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"]))

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")
))

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)

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)

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)

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))

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

Autres extensions