Pandas MultiIndex
MultiIndex ist eine leistungsstarke Indexierungsfunktion in Pandas, mit der mehrstufige hierarchische Strukturen für Zeilen oder Spalten erstellt werden können. Dies ist besonders nützlich beim Umgang mit hochdimensionalen Daten, Gruppenstatistiken und Paneldaten.
MultiIndex erstellen
Erstellen aus einer Liste
Beispiel
# Methode 1: Erstellen mit Arrays
arrays = [
["A", "A", "B", "B", "C", "C"],
[1, 2, 1, 2, 1, 2]
]
# Verwenden von pd.MultiIndex.from_arrays
index = pd.MultiIndex.from_arrays(arrays, names=["Kategorie", "Nummer"])
print("Erstellt aus Arrays:")
print(index)
print()
# Methode 2: Verwenden einer Liste von Tupeln
tuples = [
("A", 1), ("A", 2), ("B", 1), ("B", 2), ("C", 1), ("C", 2)
]
index = pd.MultiIndex.from_tuples(tuples, names=["Kategorie", "Nummer"])
print("Erstellt aus Tupeln:")
print(index)
print()
# Methode 3: Verwenden von product
index = pd.MultiIndex.from_product(
[["A", "B", "C"], [1, 2, 3]],
names=["Kategorie", "Nummer"]
)
print("Erstellt aus Produkt:")
print(index)
Erstellen eines DataFrame mit MultiIndex
Beispiel
import numpy as np
# Erstellen eines DataFrame mit MultiIndex
df = pd.DataFrame(
np.random.randn(6, 4),
index=pd.MultiIndex.from_tuples(
[("2024", "Q1"), ("2024", "Q2"), ("2024", "Q3"),
("2025", "Q1"), ("2025", "Q2"), ("2025", "Q3")]
),
columns=["Beijing", "Shanghai", "Guangzhou", "Shenzhen"]
)
df.index.names = ["Jahr", "Quartal"]
print("DataFrame mit MultiIndex:")
print(df)
Zugriff auf MultiIndex
Zugriff mit loc/iloc
Beispiel
# Beispieldaten erstellen
df = pd.DataFrame({
"Chinesisch": [85, 92, 78, 88],
"Mathematik": [90, 88, 95, 82]
}, index=pd.MultiIndex.from_tuples(
[("Jahrgangsstufe 10", "Klasse A"), ("Jahrgangsstufe 10", "Klasse B"), ("Klasse 11", "Klasse A"), ("Klasse 11", "Klasse B")],
names=["Jahrgangsstufe", "Klasse"]
))
print("Originaldaten:")
print(df)
print()
# Zugriff auf äußeren Index
print("Zugriff auf alle Grade 10:")
print(df.loc["Grade 10"])
print()
# Zugriff auf inneren Index
print("Zugriff auf Class A:")
print(df.loc[:, "Class A"])
print()
# Zugriff auf mehrere Indexebenen
print("Zugriff auf Class A von Grade 10:")
print(df.loc[("Grade 10", "Class A")])
Zugriff mit xs
Beispiel
# Beispieldaten erstellen
df = pd.DataFrame({
"Chinesisch": [85, 92, 78, 88],
"Mathematik": [90, 88, 95, 82]
}, index=pd.MultiIndex.from_tuples(
[("Jahrgangsstufe 10", "Klasse A"), ("Jahrgangsstufe 10", "Klasse B"), ("Klasse 11", "Klasse A"), ("Klasse 11", "Klasse B")],
names=["Jahrgangsstufe", "Klasse"]
))
# Verwendung von xs zum Zugriff auf Werte auf einer bestimmten Ebene
print("Zugriff auf Grade 10 mit xs:")
print(df.xs("Klasse 10", level="Klasse"))
print()
print("Zugriff auf Klasse A mit xs:")
print(df.xs("Klasse A", level="Klasse"))
MultiIndex konvertieren
Stapeln und Entstapeln
Beispiel
import numpy as np
# Erstellen eines DataFrames im Wide-Format
df = pd.DataFrame(
np.arange(12).reshape(3, 4),
index=pd.MultiIndex.from_tuples(
[("Peking", "2024"), ("Shanghai", "2024"), ("Guangzhou", "2024")]
),
columns=pd.MultiIndex.from_tuples(
[("Q1", "Umsatz"), ("Q1", "Gewinn"), ("Q2", "Umsatz"), ("Q2", "Profit")]
)
)
print("Ursprüngliche Daten (verschachtelte Spalten):")
print(df)
print()
# unstack: Inneren Index in Spalten umwandeln
df_unstacked = df.unstack()
print("Nach unstack:")
print(df_unstacked)
print()
# stack: Spalten in inneren Index umwandeln
df_stacked = df_unstacked.stack()
print("Nach Stack:")
print(df_stacked)
MultiIndex sortieren
Beispiel
# DataFrame mit unsortiertem Index erstellen
df = pd.DataFrame({
"Wert": [1, 2, 3, 4, 5, 6]
}, index=pd.MultiIndex.from_tuples(
[("C", 2), ("A", 1), ("B", 2), ("A", 2), ("C", 1), ("B", 1)],
names=["Buchstabe", "Nummer"]
))
print("Unsortierte Daten:")
print(df)
print()
# Nach äußerer Ebene sortieren
df_sorted1 = df.sort_index()
print("Nach Sortierung nach äußerer Ebene:")
print(df_sorted1)
print()
# Nach innerer Ebene sortieren
df_sorted2 = df.sort_index(level=1)
print("Nach dem Sortieren nach innerer Ebene:")
print(df_sorted2)
print()
# Nach mehreren Ebenen sortieren
df_sorted3 = df.sort_index(level=[0, 1])
print("Nach dem Sortieren nach mehreren Ebenen:")
print(df_sorted3)
Praxis: Gruppenstatistiken
MultiIndex eignet sich sehr gut für Gruppenstatistiken und Pivot-Analysen.
Beispiel
import numpy as np
# Verkaufsdaten erstellen
np.random.seed(42)
df = pd.DataFrame({
"Year": ["2023"] * 6 + ["2024"] * 6,
"Quarter": ["Q1", "Q2", "Q3", "Q4"] * 3,
"Produkt": ["Telefon", "Telefon", "Computer", "Computer"] * 3,
"Region": ["Ostchina", "Südchina", "Nordchina"] * 4,
"Verkaufsbetrag": np.random.randint(100, 500, 12)
})
print("Ursprüngliche Verkaufsdaten:")
print(df)
print()
# MultiIndex festlegen und Gruppenstatistiken durchführen
df_grouped = df.set_index(["Jahr", "Quartal", "Produkt", "Region"])
print("Gruppiert nach Jahr, Quartal, Produkt, Region:")
print(df_grouped)
# Nach Jahr zusammenfassen
yearly = df_grouped.groupby(level="Jahr").sum()
print("\n"Jährliche Verkäufe:")
print(yearly)
# Nach Jahr und Quartal zusammenfassen
quarterly = df_grouped.groupby(level=["Year", "Quarter"]).sum()
print("\n"Quartalsverkäufe:")
print(quarterly)
Häufige Probleme und Hinweise
1. Verwechslung von Indexebenen
Achten Sie darauf, beim Arbeiten mit Daten keine Ebenen zu verwechseln. Es wird empfohlen, vor und nach Operationen zu prüfen.df.index.names。
2. Fehler beim Indexzugriff
locVerwenden Sie labelbasierten Zugriff,ilocVerwenden Sie positionsbasierten Zugriff; mischen Sie die beiden nicht.
3. Doppelter Index bei Verwendung von concat
Bei VerwendungconcatBeim Zusammenführen von Daten können doppelte Indizes zu unerwarteten Ergebnissen führen. Sie könnenignore_index=Truezum Zurücksetzen.
Andere ErweiterungenMultiIndex ist eine Kernfunktion von Pandas für den Umgang mit hochdimensionalen Daten. Die korrekte Verwendung von MultiIndex kann die Datenorganisation übersichtlicher und die Statistiken bequemer machen.