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
applyoder fehlendesas_index=Falseführt zu überraschenden Shapes, doppelten Spalten und langsamen Pipelines. - Lösung: Wenige Muster reichen—
aggfür Zusammenfassungen,transformfür zeilenlange Features,applynur wenn nötig—plus Optionen für Sortierung und fehlende Gruppen.
Schnellreferenz: Wann welche Methode?
| Methode | Rückgabe-Shape | Am besten für | Beispiel |
|---|---|---|---|
agg / aggregate | Eine Zeile pro Gruppe | Zusammenfassungen, mehrere Metriken | df.groupby("team").agg(avg_score=("score","mean")) |
transform | Gleiche Länge wie Input | Gruppenbasierte Features je Zeile | df["z"] = df.groupby("team")["score"].transform("zscore") |
apply | Flexibel | Komplexe Formen, wenn agg/transform nicht reichen | df.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=Falsebehältteamals Spalte (praktisch für Merge/Plots).sort=Falsebewahrt 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=FalsebehältNaN-Gruppenlabels.sort=Falseverhindert 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
| Problem | Lösung |
|---|---|
Unerwartete Shapes (Series vs DataFrame) | as_index=False setzen oder danach reset_index(). |
| Doppelte Spaltennamen nach Merge | Named Aggregation verwenden, um Ausgabespalten zu steuern. |
Langsame Pipelines durch apply | Durch agg/transform oder Vektor-Methoden ersetzen. |
| Fehlende Kategorien in der Ausgabe | observed=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
aggfür Zusammenfassungen,transformfür zeilenlange Features,applysparsam.- Shape mit
as_indexundreset_indexsteuern. - Ordnung und fehlende Labels mit
sortunddropnamanagen. - Vektor-Methoden zuerst nutzen, um Pipelines schnell zu halten.