Skip to content

Pandas GroupBy: Aggregation, Transform, Apply (2025 Leitfaden)

Updated on

Split-Apply-Combine ist die Stärke von Pandas. Das Problem: Viele Nutzer sind unsicher, wann agg, transform oder apply sinnvoll ist, oder stolpern über Sortierung, fehlende Gruppen oder SettingWithCopy.

PAS-Rahmen:

  • Problem: Gruppierte Berechnungen wirken undurchsichtig und langsam, wenn nur Totals oder zeilenweise Kennzahlen gebraucht werden.
  • Agitation: Falscher Einsatz von apply oder fehlendes as_index=False führt zu überraschenden Shapes, doppelten Spalten und langsamen Pipelines.
  • Lösung: Wenige Muster reichen—agg für Zusammenfassungen, transform für zeilenlange Features, apply nur wenn nötig—plus Optionen für Sortierung und fehlende Gruppen.

Schnellreferenz: Wann welche Methode?

MethodeRückgabe-ShapeAm besten fürBeispiel
agg / aggregateEine Zeile pro GruppeZusammenfassungen, mehrere Metrikendf.groupby("team").agg(avg_score=("score","mean"))
transformGleiche Länge wie InputGruppenbasierte Features je Zeiledf["z"] = df.groupby("team")["score"].transform("zscore")
applyFlexibelKomplexe Formen, wenn agg/transform nicht reichendf.groupby("team").apply(custom_fn)

Beispieldaten

import pandas as pd
 
data = {
    "team": ["A", "A", "B", "B", "B", "C"],
    "player": ["x1", "x2", "y1", "y2", "y3", "z1"],
    "score": [9, 7, 8, 6, 10, 3],
    "minutes": [30, 25, 28, 32, 20, 15],
}
df = pd.DataFrame(data)

Aggregationsmuster (agg)

summary = (
    df.groupby("team", as_index=False)
      .agg(
          avg_score=("score", "mean"),
          max_score=("score", "max"),
          minutes_played=("minutes", "sum"),
      )
)
  • Named Aggregation hält Spaltennamen sauber.
  • as_index=False behält team als Spalte (praktisch für Merge/Plots).
  • sort=False bewahrt die Eingabereihenfolge, wenn sie wichtig ist.

Mehrere Aggregationen pro Spalte

df.groupby("team", as_index=False).agg(
    score_mean=("score", "mean"),
    score_std=("score", "std"),
    score_count=("score", "size"),
)

Broadcast-Features (transform)

transform behält die ursprüngliche Länge und hängt Gruppenmetriken an jede Zeile.

df["score_pct_of_team"] = (
    df["score"] / df.groupby("team")["score"].transform("sum")
)

Z-Score pro Team:

df["score_z"] = (
    df.groupby("team")["score"]
      .transform(lambda s: (s - s.mean()) / s.std(ddof=0))
)

Nutze transform für:

  • Relationen zu Gruppentotals
  • Normalisierte Scores
  • Gruppenflags (z. B. rank, cumcount)

Wann apply sinnvoll ist

apply ist flexibel, aber langsamer; nutze es nur, wenn agg/transform nicht reichen.

def top_n(group, n=2):
    return group.nlargest(n, "score")
 
top_players = df.groupby("team").apply(top_n, n=1).reset_index(drop=True)

Bevorzugt agg/transform; greife zu apply, wenn:

  • variable Zeilenzahlen pro Gruppe zurückgegeben werden müssen.
  • Logik nötig ist, die keine Vektoroperation bietet.

Fehlende Gruppen und Sortierung

result = (
    df.groupby("team", dropna=False, sort=False)
      .agg(avg_score=("score", "mean"))
)
  • dropna=False behält NaN-Gruppenlabels.
  • sort=False verhindert Neuordnung—wichtig, wenn Reihenfolge Bedeutung hat.

GroupBy mit mehreren Schlüsseln und Index

multi = (
    df.groupby(["team", "player"], as_index=False)
      .agg(score_mean=("score", "mean"))
)

Gruppieren über Indexlevel:

df2 = df.set_index(["team", "player"])
df2.groupby(level="team")["score"].mean()

Häufige Stolperfallen

ProblemLösung
Unerwartete Shapes (Series vs DataFrame)as_index=False setzen oder danach reset_index().
Doppelte Spaltennamen nach MergeNamed Aggregation verwenden, um Ausgabespalten zu steuern.
Langsame Pipelines durch applyDurch agg/transform oder Vektor-Methoden ersetzen.
Fehlende Kategorien in der Ausgabeobserved=False (Standard) lassen oder Kategorien sicherstellen; dropna=False für NaN.

Export- und Visualisierungstipps

  • Nach Aggregation für Präsentation sortieren: summary.sort_values("avg_score", ascending=False).
  • Für Charts nach Pivot: summary.pivot(index="team", values="avg_score").

Verwandte Guides


Wichtigste Punkte

  • agg für Zusammenfassungen, transform für zeilenlange Features, apply sparsam.
  • Shape mit as_index und reset_index steuern.
  • Ordnung und fehlende Labels mit sort und dropna managen.
  • Vektor-Methoden zuerst nutzen, um Pipelines schnell zu halten.