Comment utiliser groupby dans Pandas pour agréger des listes de valeurs ?

Introduction

En analyse de données avec Python et pandas, l’une des tâches les plus courantes consiste à regrouper des données et à les résumer. S’il est facile de faire la somme ou la moyenne de colonnes numériques, il arrive que l’on souhaite rassembler toutes les valeurs d’une colonne dans une liste — par exemple, pour regrouper des lignes par horodatage et obtenir la liste des fichiers associés.

Ce tutoriel montre comment utiliser groupby() de pandas avec des fonctions d’agrégation personnalisées pour :

  • Faire la somme de valeurs numériques
  • Agréger une colonne en une liste de valeurs uniques (comme des noms de fichiers ou des identifiants)

Objectif

À partir d’un DataFrame comme celui-ci :

time_coverage filename frp
2025-06-09T12:00Z file_001.nc 15.2
2025-06-09T12:00Z file_002.nc 17.5
2025-06-09T12:00Z file_001.nc 5.1
2025-06-09T13:00Z file_003.nc 9.8

Nous souhaitons regrouper par time_coverage, puis :

  • Faire la somme des valeurs frp
  • Rassembler une liste unique de fichiers pour chaque groupe

Étape 1 : Créer le DataFrame

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import pandas as pd

# Données d’exemple
df = pd.DataFrame({
    'time_coverage': [
        '2025-06-09T12:00Z',
        '2025-06-09T12:00Z',
        '2025-06-09T12:00Z',
        '2025-06-09T13:00Z'
    ],
    'filename': [
        'file_001.nc',
        'file_002.nc',
        'file_001.nc',
        'file_003.nc'
    ],
    'frp': [15.2, 17.5, 5.1, 9.8]
})

Étape 2 : Regrouper et agréger

Utilisez groupby() et agg() pour calculer la somme et collecter les noms de fichiers :

1
2
3
4
df_grouped = df.groupby('time_coverage').agg({
    'frp': 'sum',
    'filename': list  # collecte de tous les fichiers (avec doublons éventuels)
}).reset_index()

Résultat :

time_coverage frp filename
2025-06-09T12:00Z 37.8 ['file_001.nc', 'file_002.nc', 'file_001.nc']
2025-06-09T13:00Z 9.8 ['file_003.nc']

Notez que file_001.nc apparaît deux fois pour le groupe 2025-06-09T12:00Z.

Étape 3 : Obtenir des fichiers uniques

Pour retirer les doublons de la liste des fichiers, appliquez set() :

1
2
3
4
df_grouped = df.groupby('time_coverage').agg({
    'frp': 'sum',
    'filename': lambda x: list(set(x))
}).reset_index()

Résultat :

time_coverage frp filename
2025-06-09T12:00Z 37.8 ['file_001.nc', 'file_002.nc']
2025-06-09T13:00Z 9.8 ['file_003.nc']

Utilisez sorted(set(x)) pour ordonner les fichiers de manière cohérente :

1
2
3
4
df_grouped = df.groupby('time_coverage').agg({
    'frp': 'sum',
    'filename': lambda x: sorted(set(x))
}).reset_index()

Étape 4 : Parcourir et afficher les résultats

Pour afficher chaque groupe et ses fichiers uniques :

1
2
3
4
5
6
for idx, row in df_grouped.iterrows():
    print(f"Horodatage : {row['time_coverage']}")
    print("Fichiers uniques :")
    for fname in row['filename']:
        print(f"  - {fname}")
    print()

Pourquoi éliminer les doublons est utile

Retirer les doublons lors d’une agrégation par groupe est utile lorsque :

  • Vous voulez un rapport propre, sans répétition
  • Vous comptez des éléments distincts par groupe
  • Vous souhaitez éviter des redondances dans les résumés ou graphiques

Résumé

  • Utilisez groupby() pour regrouper votre DataFrame par une ou plusieurs colonnes.
  • Utilisez agg() pour :

  • Faire la somme ou la moyenne de colonnes numériques ('sum', 'mean', etc.)

  • Collecter des valeurs uniques avec lambda x: list(set(x))
  • Triez les listes avec sorted(set(x)) pour plus de lisibilité.

Cas d’usage

  • Regrouper par date ou heure et lister les fichiers associés
  • Agréger les identifiants utilisateurs uniques par catégorie
  • Compiler des étiquettes ou des mots-clés par article ou événement
  • Dédupliquer les sources associées à un événement