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_indexaufbauen, sicher mit.loc/.xsslicen, mitswaplevel/reorder_levelsumordnen und mitstack/unstackumformen.
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
| Aufgabe | Methode | Snippet |
|---|---|---|
| Levels aus Spalten aufbauen | set_index | df.set_index(["region", "year"]).sort_index() |
| Aus kartesischem Produkt | pd.MultiIndex.from_product | pd.MultiIndex.from_product([regions, years], names=["region", "year"]) |
| Nach Level slicen | .loc oder .xs | df.loc[("EMEA", 2024)] oder df.xs("EMEA", level="region") |
| Levels umordnen | swaplevel, reorder_levels | df.swaplevel("region", "year") |
| Entfernen oder abflachen | droplevel, reset_index | df.droplevel("year"), df.reset_index() |
| Wide/Long umformen | unstack / stack | df.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
IndexSliceslicen, 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")swaplevelist schnell für das Tauschen zweier benachbarter Levels;reorder_levelserlaubt 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=inunstack, um fehlende Kombinationen zu ersetzen. - Für Pivot-ähnliche Operationen auf Spalten:
set_index([...]).unstack()mitstack()kombinieren, statt manuelle Schleifen zu schreiben.
Wann MultiIndex vs. Spalten verwenden?
| Szenario | MultiIndex | Normale 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(odernames=inset_index) setzen, um Slices undreset_indexübersichtlich zu halten. - Schwer lesbare Ausgabe:
df.index.to_frame()zeigt Levels als Spalten zur Inspektion, undreset_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.