Aller au contenu principal

Regrouper les données

groupby partitionne les lignes selon une ou plusieurs clés, applique une opération à chaque partition, puis combine les résultats. Décidez d'abord de la forme de sortie voulue.

Choisir selon la forme

OpérationRésultat
aggune ligne par groupe pour les résumés scalaires
transformvaleurs alignées sur les lignes d'origine
filtergroupes entiers conservés ou supprimés
applysortie flexible ; uniquement si les autres formes ne conviennent pas
import pandas as pd

sales = pd.DataFrame({
"region": ["east", "east", "west", None], "product": ["A", "A", "B", "A"],
"amount": [10.0, 30.0, 0.0, 5.0], "order_id": [1, 2, 3, 4],
})
summary = (
sales.groupby(["region", "product"], as_index=False, dropna=False, observed=True)
.agg(revenue=("amount", "sum"), orders=("order_id", "nunique"))
)

totals = sales.groupby("region", dropna=False, observed=True)["amount"].transform("sum")
sales["region_share"] = sales["amount"].div(totals.where(totals.ne(0)))

Une agrégation nommée indique à la fois la colonne source et le nom de sortie. Les opérations de groupe intégrées sont généralement plus claires et rapides que les fonctions de rappel Python.

Décisions essentielles

  • dropna=True exclut par défaut les clés de groupe manquantes ; choisissez explicitement si l'absence forme un groupe significatif.
  • observed détermine si les catégories inutilisées apparaissent ; précisez-le si la forme doit rester stable entre versions.
  • sort=False évite un tri inutile lorsque l'ordre des groupes n'importe pas.
  • as_index=False conserve les clés comme colonnes, ce qui simplifie souvent la suite.

Sortie MultiIndex

Un regroupement sur plusieurs clés peut produire un MultiIndex. Conservez-le si la sélection hiérarchique est utile ; sinon, revenez à une table plate avec as_index=False ou reset_index().

Limite de apply

Réservez GroupBy.apply aux algorithmes réellement structurés par groupe qui ne peuvent être exprimés par agrégation, transformation, filtrage, fenêtrage ou jointure. Ne modifiez pas l'objet groupe dans la fonction et testez explicitement le comportement de l'index.

Ramener les totaux aux lignes

Ici, summary comporte trois lignes : east/A donne un revenu de 40 et deux commandes distinctes ; west/B donne 0 et une commande ; le groupe région manquante/A donne 5 et une commande. transform("sum") rediffuse les totaux [40, 40, 0, 5] sur les lignes avec leur index initial. Les parts valent [0.25, 0.75, NaN, 1.0] : le groupe de total nul n’a pas de part définie.

Dans l’API de regroupement, size compte les lignes, count les valeurs présentes par colonne sélectionnée, et nunique les valeurs distinctes non manquantes par défaut. Ces questions diffèrent. Une somme ignore les valeurs manquantes et peut donner zéro pour un groupe entièrement manquant ; utilisez sum(min_count=1) pour conserver l’inconnu. filter(lambda g: len(g) >= 2) garderait les deux lignes east, sans les résumer.

Source

Explorer les liensOuvrir le réseau