Skip to content

Pandas MultiIndex: Leitfaden zur hierarchischen Indexierung

Updated on

MultiIndex eröffnet saubere Hierarchien für Panel-, Zeitreihen- und umgeformte Daten, aber viele Anwender meiden ihn, weil Slicing fragil wirkt und die Level-Reihenfolge verwirrend werden kann.

  • Problem: Verschachtelte Dimensionen (region + year, symbol + field) werden unübersichtlich, wenn sie in normalen Spalten oder breiten Tabellen gespeichert sind.
  • Agitation: Ad-hoc-Reshapes führen zu doppelten Spaltennamen, kaputten Sortierungen und Fehlern bei der Auswahl nach mehreren Schlüsseln.
  • Lösung: Verwende ein kleines Set wiederholbarer Muster: MultiIndex mit set_index aufbauen, sicher mit .loc/.xs slicen, mit swaplevel/reorder_levels umordnen und mit stack/unstack umformen.

Want an AI agent that understands your pandas notebooks and MultiIndex slicing?

RunCell is a JupyterLab AI agent that can read your code, analyze DataFrames, understand notebook context, debug errors, and even generate & execute code for you. It works directly inside JupyterLab—no switching windows or copy-pasting.

👉 Try RunCell: runcell.dev (opens in a new tab)


Kurzübersicht

AufgabeMethodeSnippet
Levels aus Spalten aufbauenset_indexdf.set_index(["region", "year"]).sort_index()
Aus kartesischem Produktpd.MultiIndex.from_productpd.MultiIndex.from_product([regions, years], names=["region", "year"])
Nach Level slicen.loc oder .xsdf.loc[("EMEA", 2024)] oder df.xs("EMEA", level="region")
Levels umordnenswaplevel, reorder_levelsdf.swaplevel("region", "year")
Entfernen oder abflachendroplevel, reset_indexdf.droplevel("year"), df.reset_index()
Wide/Long umformenunstack / stackdf.unstack("field"), df.stack("field")

Beispieldaten

import pandas as pd
 
records = [
    ("EMEA", 2023, "revenue", 120),
    ("EMEA", 2023, "profit", 25),
    ("EMEA", 2024, "revenue", 140),
    ("NA", 2024, "revenue", 210),
    ("NA", 2024, "profit", 50),
]
 
df = (
    pd.DataFrame(records, columns=["region", "year", "metric", "value"])
      .set_index(["region", "year", "metric"])
      .sort_index()
)

MultiIndex-Strukturen erstellen

Aus bestehenden Spalten

sales = raw_df.set_index(["region", "year"]).sort_index()
  • Verwende sort_index() für vorhersagbares Slicing über mehrere Levels.
  • Lass Spalten, die normale Werte darstellen (z.B. Beträge), außerhalb des Index.

Aus Produkt oder Tupeln

idx = pd.MultiIndex.from_product(
    [["EMEA", "NA"], [2023, 2024]],
    names=["region", "year"],
)
frame = pd.DataFrame(index=idx, columns=["revenue"]).sort_index()

from_product garantiert, dass jede Kombination existiert; verwende from_tuples, wenn du bereits Paare hast.


Auswählen mit MultiIndex

# Ein einzelner Pfad durch die Hierarchie
emea_2024 = df.loc[("EMEA", 2024)]
 
# Querschnitt über ein Level, die restlichen bleiben erhalten
emea = df.xs("EMEA", level="region")
 
# Partielle Auswahl mit Slices (benötigt sortierten Index)
idx = pd.IndexSlice
subset = df.loc[idx[:, 2024, :], :]
  • .xs (Cross-Section) ist praktisch, wenn du die übrigen Levels intakt behalten möchtest.
  • Für Zeitreihen-Hierarchien: Index sortieren und mit IndexSlice slicen, um die Lesbarkeit zu erhöhen.

Levels umordnen und bereinigen

# year vor region bringen
reordered = df.swaplevel("region", "year").sort_index(level=["year", "region"])
 
# Explizites Umordnen für 3+ Levels
df_reordered = df.reorder_levels(["metric", "region", "year"])
 
# Ein Level entfernen, wenn es nicht mehr benötigt wird
flat = df.droplevel("metric")
  • swaplevel ist schnell für das Tauschen zweier benachbarter Levels; reorder_levels erlaubt beliebige Reihenfolgen.
  • Nach dem Umordnen sort_index(level=...) aufrufen, um die monotone Ordnung für Slicing wiederherzustellen.

Umformen mit Stack und Unstack

Wandelt breite Tabellen in saubere Long-Form (und zurück), indem Index-Levels als Pivot verwendet werden.

wide = df.unstack("metric")  # metric-Werte werden zu Spalten
long_again = wide.stack("metric")
  • Verwende fill_value= in unstack, um fehlende Kombinationen zu ersetzen.
  • Für Pivot-ähnliche Operationen auf Spalten: set_index([...]).unstack() mit stack() kombinieren, statt manuelle Schleifen zu schreiben.

Wann MultiIndex vs. Spalten verwenden?

SzenarioMultiIndexNormale Spalten
Hierarchische Labels steuern das Slicing (region → year → metric)✅ Natürliche Passform für .loc/.xs⚠️ Erfordert wiederholte Filter/Joins
Breites Reporting-Layout✅ Mit unstack bei Bedarf in Spalten bringen⚠️ Risiko doppelter Spaltennamen
Häufige Joins auf Schlüsseln⚠️ Zuerst resetten, dann mergen✅ Schlüssel als Spalten für Joins behalten
Export nach CSV/Parquet✅ Vor dem Schreiben reset_index()✅ Kein zusätzlicher Schritt

Pragmatische Regel: Speichere Daten mit klaren Schlüsseln als Spalten für den Austausch; nutze MultiIndex, wenn hierarchisches Slicing oder Umformen der Haupt-Workflow ist.


Häufige Stolperfallen und Lösungen

  • Nicht sortierter Index blockiert Slicing: sort_index(level=[...]) vor partiellen Slices aufrufen.
  • Unbenannte Levels: index.names (oder names= in set_index) setzen, um Slices und reset_index übersichtlich zu halten.
  • Schwer lesbare Ausgabe: df.index.to_frame() zeigt Levels als Spalten zur Inspektion, und reset_index() flacht alles ab, wenn du wieder normale Spalten brauchst.

Wenn du standardisierst, wie du MultiIndex-Objekte aufbaust, slicest, umordnest und umformst, bekommst du saubere Hierarchien ohne die übliche Verwirrung. Kombiniere diese Muster mit Reshape-Guides wie pandas-pivot-melt und Time-Series-Helfern wie pandas-resample, um mehrdimensionale Daten von Ende zu Ende beherrschbar zu halten.