Regroupement et Agrégation avec Pandas

PandasBeginner
Pratiquer maintenant

Introduction

Le regroupement et l'agrégation de données sont des opérations fondamentales en analyse de données. Ils vous permettent de diviser un grand ensemble de données en groupes plus petits basés sur certains critères, puis de calculer des statistiques récapitulatives pour chaque groupe. Ce processus est essentiel pour découvrir des tendances, comparer des segments et tirer des informations significatives à partir de données brutes.

Dans la bibliothèque d'analyse de données Python, Pandas, cette stratégie "split-apply-combine" (diviser-appliquer-combiner) est principalement gérée par la puissante méthode groupby(). Dans ce laboratoire, vous apprendrez à utiliser groupby() pour effectuer le regroupement et l'agrégation. Vous commencerez par regrouper des données par une seule colonne, appliquerez des fonctions d'agrégation, utiliserez plusieurs fonctions à la fois, regrouperez par plusieurs colonnes, et enfin, formaterez la sortie dans un DataFrame standard.

Regrouper par une seule colonne avec groupby

Dans cette étape, vous apprendrez l'utilisation de base de la méthode groupby() pour diviser un DataFrame en groupes. La méthode groupby() elle-même ne calcule rien mais retourne un objet DataFrameGroupBy. Cet objet contient toutes les informations nécessaires pour appliquer ensuite des calculs à chaque groupe.

Tout d'abord, regroupons notre DataFrame d'exemple par la colonne Category. Cela créera des groupes distincts pour 'Electronics', 'Clothing' et 'Books'.

Ouvrez le fichier main.py dans l'éditeur à gauche. Le code initial pour créer un DataFrame est déjà présent. Ajoutez le code suivant à la fin du fichier main.py :

## Group by the 'Category' column
grouped_by_category = df.groupby('Category')

## The result is a DataFrameGroupBy object
print("Type of the grouped object:")
print(type(grouped_by_category))

## To see the contents, you can iterate over the groups
print("\nIterating over groups to see their content:")
for name, group in grouped_by_category:
    print(f"\nGroup: {name}")
    print(group)

Maintenant, exécutez le script depuis le terminal pour voir la sortie.

python3 main.py

Vous verrez le DataFrame original, suivi du type de l'objet groupby, puis du contenu de chaque groupe. Cela démontre que le DataFrame a été divisé avec succès en fonction des valeurs uniques de la colonne 'Category'.

Original DataFrame:
      Category Region  Sales  Units
0  Electronics  North   1200     10
1     Clothing  South    800     25
2  Electronics  North   1500      8
3        Books   West    300     15
4     Clothing   East    900     20
5        Books   West    450     18

==============================

Type of the grouped object:
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

Iterating over groups to see their content:

Group: Books
  Category Region  Sales  Units
3    Books   West    300     15
5    Books   West    450     18

Group: Clothing
   Category Region  Sales  Units
1  Clothing  South    800     25
4  Clothing   East    900     20

Group: Electronics
      Category Region  Sales  Units
0  Electronics  North   1200     10
2  Electronics  North   1500      8

Appliquer l'agrégation sum sur les groupes

Dans cette étape, vous apprendrez comment appliquer une fonction d'agrégation aux groupes que vous avez créés. Après avoir regroupé les données, l'étape suivante la plus courante consiste à effectuer un calcul, tel que sum(), mean(), count(), ou max(), sur chaque groupe.

Calculons le total des ventes pour chaque catégorie de produits. Pour ce faire, vous regroupez d'abord par Category, puis sélectionnez la colonne Sales pour appliquer la fonction sum().

Ajoutez le code suivant à la fin de votre fichier main.py. Vous pouvez supprimer la boucle for de l'étape précédente pour garder la sortie propre.

## Group by 'Category' and calculate the sum of 'Sales' for each group
category_sales_sum = df.groupby('Category')['Sales'].sum()

print("Total sales per category:")
print(category_sales_sum)

Enregistrez le fichier et exécutez-le à nouveau.

python3 main.py

La sortie affichera maintenant une série Pandas où l'index est le nom de la catégorie et les valeurs sont le total des ventes pour cette catégorie.

... (previous output) ...

Total sales per category:
Category
Books           750
Clothing       1700
Electronics    2700
Name: Sales, dtype: int64

C'est une manière puissante et concise de résumer vos données. Vous pouvez appliquer la même logique à d'autres colonnes numériques ou utiliser d'autres fonctions d'agrégation comme mean() pour trouver la moyenne.

Agréger plusieurs fonctions avec agg

Dans cette étape, vous apprendrez comment appliquer simultanément plusieurs fonctions d'agrégation à vos groupes en utilisant la méthode agg(). Ceci est très utile lorsque vous souhaitez calculer plusieurs statistiques récapitulatives en une seule fois, comme le total et la moyenne des ventes.

La méthode agg() peut recevoir une liste de chaînes de caractères, où chaque chaîne est le nom d'une fonction d'agrégation. Calculons la sum (somme) et la mean (moyenne) des Sales pour chaque Category.

Ajoutez le code suivant à la fin de votre fichier main.py :

## Group by 'Category' and apply multiple aggregations on 'Sales'
category_agg = df.groupby('Category')['Sales'].agg(['sum', 'mean'])

print("\nSum and mean of sales per category:")
print(category_agg)

Enregistrez le fichier et exécutez-le.

python3 main.py

La sortie est maintenant un DataFrame. L'index est toujours la Category, mais les colonnes sont hiérarchiques, montrant à la fois la sum et la mean pour les données de Sales.

... (previous output) ...

Sum and mean of sales per category:
              sum    mean
Category
Books         750   375.0
Clothing     1700   850.0
Electronics  2700  1350.0

La méthode agg() offre un moyen flexible de générer des résumés complets de vos données groupées.

Grouper par plusieurs colonnes

Dans cette étape, vous apprendrez comment regrouper un DataFrame par plus d'une colonne. Ceci est utile pour créer des groupes plus granulaires et analyser les interactions entre différentes catégories. Pour ce faire, il suffit de passer une liste de noms de colonnes à la méthode groupby().

Trouvons le total des ventes pour chaque combinaison de Region et de Category. Cela nous montrera comment les ventes des différentes catégories de produits sont réparties entre les régions.

Ajoutez le code suivant à la fin de votre fichier main.py :

## Group by multiple columns: 'Region' and 'Category'
multi_group_sum = df.groupby(['Region', 'Category'])['Sales'].sum()

print("\nTotal sales per Region and Category:")
print(multi_group_sum)

Enregistrez le fichier et exécutez le script.

python3 main.py

La sortie aura un MultiIndex sur les lignes, le premier niveau étant Region et le second niveau étant Category. Cela fournit une ventilation détaillée des ventes.

... (previous output) ...

Total sales per Region and Category:
Region  Category
East    Clothing        900
North   Electronics    2700
South   Clothing        800
West    Books           750
Name: Sales, dtype: int64

Comme vous pouvez le constater, le regroupement par plusieurs colonnes permet une analyse plus approfondie et plus hiérarchique de votre jeu de données.

Réinitialiser l'index sur un DataFrame groupé

Dans cette étape, vous apprendrez comment convertir la sortie groupée en un DataFrame régulier, où les clés de regroupement sont des colonnes au lieu de l'index. Par défaut, groupby() fait des clés de regroupement l'index de la Series ou du DataFrame résultant. Parfois, vous souhaitez un DataFrame "plat" pour un traitement ou une visualisation ultérieure.

La manière la plus simple d'y parvenir est d'utiliser le paramètre as_index=False dans la méthode groupby().

Répétons le regroupement par colonne unique de l'Étape 2, mais cette fois, nous garderons Category comme une colonne régulière.

Ajoutez le code suivant à la fin de votre fichier main.py :

## Group by 'Category' and aggregate, but keep 'Category' as a column
category_sales_flat = df.groupby('Category', as_index=False)['Sales'].sum()

print("\nGrouped data with 'Category' as a column:")
print(category_sales_flat)

Enregistrez le fichier et exécutez-le une dernière fois.

python3 main.py

Observez la sortie. Au lieu que Category soit l'index, c'est maintenant la première colonne d'un nouveau DataFrame, et le DataFrame a un index entier standard (0, 1, 2).

... (previous output) ...

Grouped data with 'Category' as a column:
      Category  Sales
0        Books    750
1     Clothing   1700
2  Electronics   2700

Ce format est souvent plus pratique pour les tâches de manipulation de données ultérieures. Une méthode alternative consiste à appeler .reset_index() sur le résultat groupé, ce qui produit le même résultat.

Résumé

Félicitations pour avoir terminé ce laboratoire sur le regroupement et l'agrégation avec Pandas ! Vous avez appris l'une des fonctionnalités les plus puissantes et les plus couramment utilisées de la bibliothèque Pandas pour l'analyse de données.

Dans ce laboratoire, vous avez pratiqué :

  • La division d'un DataFrame en groupes à l'aide de df.groupby('column_name').
  • L'application d'une seule fonction d'agrégation comme .sum() aux groupes.
  • L'utilisation de la méthode .agg() pour appliquer plusieurs fonctions d'agrégation à la fois.
  • Le regroupement par plusieurs colonnes pour créer un résumé hiérarchique à l'aide de df.groupby(['col1', 'col2']).
  • La création d'un DataFrame plat à partir d'une opération groupby en utilisant le paramètre as_index=False.

La maîtrise de ces techniques est une étape cruciale pour devenir compétent en manipulation et analyse de données avec Python et Pandas.