Pandas Pivot vs Melt: Daten richtig umformen
Updated on
Formate wechseln ist oft der Engpass vor Analyse oder Visualisierung. Falsche Wahl dupliziert Zeilen, lässt Werte fallen oder erzeugt schwer lesbare breite Tabellen.
PAS:
- Problem: Chaotische Wide/Long-Daten bremsen Charts und Aggregationen.
- Agitation:
pivotwirft Fehler bei Duplikaten,meltfalsch eingesetzt multipliziert Zeilen oder verliert IDs. - Lösung: Tidy-Workflow nutzen—
pivot_tablebei Duplikaten,pivotbei eindeutigen Keys,meltfür Long-Format,stack/unstackfür MultiIndex-Feintuning.
Schnellübersicht
| Methode | Richtung | Wann einsetzen | Handhabt Duplikate? |
|---|---|---|---|
pivot | long → wide | Keys eindeutig | 🚫 (Fehler bei Duplikaten) |
pivot_table | long → wide | Aggregation oder Duplikate | ✅ per aggfunc |
melt | wide → long | Spalten in Zeilen normalisieren | N/A |
stack / unstack | wide ↔ long auf Index-Ebene | MultiIndex-Umformung | N/A |
Beispieldaten
import pandas as pd
sales = pd.DataFrame({
"region": ["NA", "NA", "EU", "EU"],
"quarter": ["Q1", "Q2", "Q1", "Q2"],
"product": ["A", "A", "A", "A"],
"revenue": [120, 140, 110, 150],
"units": [10, 11, 9, 12],
})Wide mit pivot
wide = sales.pivot(index="region", columns="quarter", values="revenue")- Benötigt eindeutige Kombination aus
region+quarter. - Mit
.reset_index()flach machen, falls nötig.
Aggregiertes Wide mit pivot_table
table = sales.pivot_table(
index="region",
columns="quarter",
values="revenue",
aggfunc="sum",
margins=True,
margins_name="Total"
)- Aggregiert bei Duplikaten.
fill_value=0ersetzt fehlende Zellen für saubere Exporte.
Mehrere Werte und Aggregationen
multi = sales.pivot_table(
index="region",
columns="quarter",
values=["revenue", "units"],
aggfunc={"revenue": "sum", "units": "mean"},
)Spalten flach ziehen:
multi.columns = [f"{metric}_{col}" for metric, col in multi.columns]
multi = multi.reset_index()Long-Format mit melt
long = sales.melt(
id_vars=["region", "quarter"],
value_vars=["revenue", "units"],
var_name="metric",
value_name="value",
)- Ideal für Libraries, die tidy data erwarten (eine Variable pro Spalte, eine Beobachtung pro Zeile).
- Mit
value_varssteuern, welche Spalten entpivotiert werden.
Stack und Unstack für MultiIndex
stacked = table.stack()
unstacked = stacked.unstack()- Gut, um Level umzuordnen, ohne Keys neu zu definieren.
- Level wählen mit
stack(level="quarter")oderunstack(level=-1).
Häufige Fehler
| Problem | Lösung |
|---|---|
ValueError: Index contains duplicate entries bei pivot | Zu pivot_table mit Aggregation wechseln. |
| Unerwartete Spaltenreihenfolge | Spalten sortieren: table = table.reindex(sorted(table.columns), axis=1). |
| Schwer lesbarer MultiIndex | Nach pivot_table Spalten flach ziehen. |
| Fehlende Werte nach Umformung | fill_value nutzen oder stack(dropna=False) für leere Zellen. |
Workflow-Tipps
- Normalisiere erst:
melt→groupby/agg→pivot_tablefür Präsentation. - Für Plots Daten lang lassen; wide ist gut für Reports/Export.
- Nach
pivot_tablenach Excel exportieren:table.to_excel("report.xlsx").
Verwandte Guides
Wichtigste Punkte
pivotbei eindeutigen Keys,pivot_tablebei Aggregation,meltfür Long-Format.- MultiIndex nach komplexen Pivots flach ziehen, um Exporte sauber zu halten.
- Reshape mit
groupbykombinieren, um schnell analysierbare Datensätze zu erhalten.