Skip to content

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: pivot wirft Fehler bei Duplikaten, melt falsch eingesetzt multipliziert Zeilen oder verliert IDs.
  • Lösung: Tidy-Workflow nutzen—pivot_table bei Duplikaten, pivot bei eindeutigen Keys, melt für Long-Format, stack/unstack für MultiIndex-Feintuning.

Schnellübersicht

MethodeRichtungWann einsetzenHandhabt Duplikate?
pivotlong → wideKeys eindeutig🚫 (Fehler bei Duplikaten)
pivot_tablelong → wideAggregation oder Duplikate✅ per aggfunc
meltwide → longSpalten in Zeilen normalisierenN/A
stack / unstackwide ↔ long auf Index-EbeneMultiIndex-UmformungN/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=0 ersetzt 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_vars steuern, 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") oder unstack(level=-1).

Häufige Fehler

ProblemLösung
ValueError: Index contains duplicate entries bei pivotZu pivot_table mit Aggregation wechseln.
Unerwartete SpaltenreihenfolgeSpalten sortieren: table = table.reindex(sorted(table.columns), axis=1).
Schwer lesbarer MultiIndexNach pivot_table Spalten flach ziehen.
Fehlende Werte nach Umformungfill_value nutzen oder stack(dropna=False) für leere Zellen.

Workflow-Tipps

  • Normalisiere erst: meltgroupby/aggpivot_table für Präsentation.
  • Für Plots Daten lang lassen; wide ist gut für Reports/Export.
  • Nach pivot_table nach Excel exportieren: table.to_excel("report.xlsx").

Verwandte Guides


Wichtigste Punkte

  • pivot bei eindeutigen Keys, pivot_table bei Aggregation, melt für Long-Format.
  • MultiIndex nach komplexen Pivots flach ziehen, um Exporte sauber zu halten.
  • Reshape mit groupby kombinieren, um schnell analysierbare Datensätze zu erhalten.