Pandas & NumPy Academy · Lektion

Daten aus einem MultiIndex auswählen

Rufen Sie Daten auf äußeren und inneren Indexebenen mit .loc, Tupeln, Slices und dem Hilfsobjekt pd.IndexSlice ab.

Lektion 2 von 413 Schritte

Daten aus einem MultiIndex auswählen ist eine kostenlose Pandas & NumPy Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Pandas & NumPy Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.

Hierarchische Daten navigieren

Sobald Sie einen MultiIndex haben, benötigen Sie effiziente Möglichkeiten, Teilmengen der Daten abzurufen. Pandas stellt dafür drei Werkzeuge bereit: .loc mit Tupeln für die Auswahl exakter Beschriftungen, slice() und pd.IndexSlice für die Auswahl von Bereichen über mehrere Ebenen hinweg sowie .xs() für die Auswahl eines Querschnitts auf einer bestimmten Ebenenebene. Wenn Sie diese Zugriffsmuster beherrschen, können Sie die volle Leistungsfähigkeit der hierarchischen Indizierung nutzen.

import pandas as pd
import numpy as np

# Setup: GDP data by country and year
df_flat = pd.DataFrame({
    'country': ['USA','USA','USA','UK','UK','UK','DE','DE','DE'],
    'year': [2021, 2022, 2023, 2021, 2022, 2023, 2021, 2022, 2023],
    'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200, 4100, 4200, 4350]
})
df = df_flat.set_index(['country', 'year']).sort_index()
print(df)

Auswahl nach der äußeren Ebene mit .loc

Übergeben Sie .loc[] eine einzelne Beschriftung der äußeren Ebene, um alle Zeilen dieser Gruppe abzurufen. Bei einem zweistufigen MultiIndex (Land, Jahr) gibt df.loc['USA'] alle Zeilen für die USA als DataFrame zurück, wobei nur der innere Index (Jahr) erhalten bleibt. Dieses Verhalten wird als Entfernen einer Ebene bezeichnet: Wenn Sie einen bestimmten Wert auf einer äußeren Ebene auswählen, entfernt Pandas diese Ebene aus dem Index des zurückgegebenen Objekts.

import pandas as pd

df_flat = pd.DataFrame({
    'country': ['USA','USA','USA','UK','UK','UK'],
    'year': [2021, 2022, 2023, 2021, 2022, 2023],
    'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year']).sort_index()

# Select all USA rows
usa = df.loc['USA']
print('All USA rows:')
print(usa)
print('\nRemaining index type:', usa.index.name)

Auswahl eines bestimmten Tupels mit .loc

Um eine einzelne Zeile abzurufen, die durch beide Indexebenen bestimmt ist, übergeben Sie .loc[] ein Tupel: df.loc[('USA', 2022)]. Dies gibt eine Series zurück (oder bei einer einzelnen Spalte einen Skalar), die genau dieser Kombination aus äußerer und innerer Beschriftung entspricht. Sie müssen das Tupel in eine Liste einschließen: df.loc[[('USA', 2022)]], wenn Sie statt einer Series einen DataFrame zurückerhalten möchten.

import pandas as pd

df_flat = pd.DataFrame({
    'country': ['USA','USA','USA','UK','UK','UK'],
    'year': [2021, 2022, 2023, 2021, 2022, 2023],
    'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200],
    'cpi': [3.2, 5.1, 4.8, 2.5, 3.4, 3.0]
})
df = df_flat.set_index(['country', 'year']).sort_index()

# Single row as Series
print('USA 2022 (Series):')
print(df.loc[('USA', 2022)])

# Single row as DataFrame
print('\nUSA 2022 (DataFrame):')
print(df.loc[[('USA', 2022)]])

Auswahl mehrerer Zeilen mit einer Tupelliste

Um mehrere bestimmte Zeilen gleichzeitig auszuwählen, übergeben Sie .loc[] eine Liste von Tupeln. Dies ist nützlich, wenn Sie eine nicht zusammenhängende Teilmenge von Zeilen auswählen müssen, die durch zusammengesetzte Schlüssel bestimmt ist – beispielsweise die Daten für 2022 für die USA und das Vereinigte Königreich, aber nicht für Deutschland. Das Ergebnis behält den MultiIndex im zurückgegebenen DataFrame bei.

import pandas as pd

df_flat = pd.DataFrame({
    'country': ['USA','USA','UK','UK','DE','DE'],
    'year': [2022, 2023, 2022, 2023, 2022, 2023],
    'gdp_bn': [25000, 26000, 3100, 3200, 4200, 4350]
})
df = df_flat.set_index(['country', 'year']).sort_index()

# Select specific (country, year) combinations
subset = df.loc[[('USA', 2022), ('UK', 2023), ('DE', 2022)]]
print(subset)

Slicing mit pd.IndexSlice

Mit pd.IndexSlice (häufig als idx abgekürzt) können Sie Bereiche für MultiIndex-Ebenen formulieren, ohne ausführliche Tupel-Slices manuell zu erstellen. Syntax: df.loc[idx[outer_slice, inner_slice], column_slice]. Beispielsweise wählt df.loc[idx['UK':'USA', 2022:2023], :] alle Zeilen aus, bei denen die äußere Ebene zwischen UK und USA und die innere Ebene zwischen 2022 und 2023 liegt. Damit dies korrekt funktioniert, muss der Index sortiert sein.

import pandas as pd
import numpy as np

years = [2021, 2022, 2023]
countries = ['DE', 'UK', 'USA']
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': np.random.randint(3000, 26000, 9)}, index=mi)

idx = pd.IndexSlice

# Select UK and USA for years 2022 and 2023
subset = df.loc[idx['UK':'USA', 2022:2023], :]
print(subset)

Zugriff auf einen Querschnitt mit .xs()

df.xs(key, level=) wählt alle Zeilen aus, bei denen eine bestimmte Ebene einem vorgegebenen Wert entspricht, unabhängig von den Inhalten der anderen Ebenen. Im Gegensatz zu .loc, bei dem Sie zuerst die äußeren Ebenen angeben müssen, kann .xs direkt auf jede Ebene anhand ihres Namens zugreifen. Beispielsweise gibt df.xs(2022, level='year') alle Zeilen für 2022 über alle Länder hinweg zurück, ohne dass Sie 'USA', 'UK' oder 'DE' angeben müssen.

import pandas as pd
import numpy as np

countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)

# All countries for year 2022 (inner level)
print('All data for year 2022:')
print(df.xs(2022, level='year'))

# All years for UK (outer level)
print('\nAll years for UK:')
print(df.xs('UK', level='country'))

Zugriff auf MultiIndex-Spalten

Wenn ein DataFrame einen MultiIndex für die Spalten besitzt, verwenden Sie Tupel, um auf bestimmte Spalten zuzugreifen: df[('revenue', 'Q1')]. Um alle Spalten einer äußeren Ebene auszuwählen (z. B. alle Umsatzspalten), verwenden Sie df['revenue']. Dies gibt einen DataFrame mit allen Spalten der inneren Ebene unter diesem äußeren Schlüssel zurück. Das Muster mit pd.IndexSlice funktioniert in Kombination mit .loc ebenfalls für MultiIndexes von Spalten.

import pandas as pd
import numpy as np

metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
cols = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
df = pd.DataFrame(
    np.random.randint(50, 200, (3, 8)),
    columns=cols,
    index=['USA', 'UK', 'DE']
)

# Access all revenue columns
print('Revenue columns:')
print(df['revenue'])

# Access a specific cell
print('\nUSA revenue Q1:', df.loc['USA', ('revenue', 'Q1')])

Auswahl der inneren Ebene über alle äußeren Schlüssel

Um einen einzelnen Wert der inneren Ebene über alle Werte der äußeren Ebene hinweg auszuwählen, kombinieren Sie .loc mit einem slice(None) für die äußere Ebene: df.loc[(slice(None), 2022), :]. Dadurch wird die Zeile für 2022 aus jedem Land ausgewählt. Die Variante mit pd.IndexSlice ist übersichtlicher: df.loc[idx[:, 2022], :]. Dieses Muster wird häufig benötigt, wenn Sie eine Momentaufnahme aller Entitäten zu einem bestimmten Zeitpunkt abrufen möchten.

import pandas as pd
import numpy as np

countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)

idx = pd.IndexSlice

# All countries for year 2022 (using IndexSlice)
all_2022 = df.loc[idx[:, 2022], :]
print('All countries in 2022:')
print(all_2022)

Häufige Fehler bei der Auswahl mit MultiIndex

Drei häufige Fehlerquellen: 1) Nicht sortierter Index: Das Slicing eines nicht sortierten MultiIndex löst UnsortedIndexError aus oder liefert falsche Ergebnisse – rufen Sie immer zuerst sort_index() auf. 2) KeyError bei einem Tupel als Schlüssel: Wenn Sie ein Tupel übergeben, ohne es in .loc[] einzuschließen, interpretiert Python es als positionsbasierten Indexzugriff – verwenden Sie für den beschriftungsbasierten Zugriff auf einen MultiIndex immer .loc. 3) Nicht übereinstimmende Ebenen: Nach groupby stimmen die Namen der MultiIndex-Ebenen möglicherweise nicht mit Ihren Erwartungen überein – überprüfen Sie vor dem Slicing df.index.names.

import pandas as pd

# Unsorted MultiIndex slicing
tuples = [('B', 2), ('A', 1), ('B', 1), ('A', 2)]
mi = pd.MultiIndex.from_tuples(tuples, names=['letter', 'num'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=mi)

print('Is sorted:', df.index.is_monotonic_increasing)
# Sort before slicing
df = df.sort_index()
print('After sort:', df.index.is_monotonic_increasing)

idx = pd.IndexSlice
print('\nSlice A:')
print(df.loc[idx['A', :], :])

Praxisbeispiel: Quartalsberichte

Ein konkreter Anwendungsfall: Sie haben Verkaufsdaten mit einem Index aus (Region, Quartal) und müssen für einen Jahresendbericht das vierte Quartal aus allen Regionen extrahieren. Verwenden Sie .xs('Q4', level='quarter'), um diesen Querschnitt mit einem einzigen Aufruf abzurufen. Berechnen Sie anschließend die Summe mit .sum(). Dieses Muster – Aggregation mit groupby → MultiIndex-Ergebnis → Extraktion eines Querschnitts – kommt in Pipelines für Geschäftsberichte äußerst häufig vor.

import pandas as pd
import numpy as np

regions = ['North', 'South', 'East', 'West']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
mi = pd.MultiIndex.from_product([regions, quarters], names=['region', 'quarter'])

np.random.seed(42)
df = pd.DataFrame({
    'sales': np.random.randint(200, 500, 16),
    'units': np.random.randint(50, 150, 16)
}, index=mi)

# Extract Q4 performance across all regions
q4 = df.xs('Q4', level='quarter')
print('Q4 Results by Region:')
print(q4)
print('\nQ4 Total Sales:', q4['sales'].sum())

MultiIndex-Auswahl mit Spalten kombinieren

Sie können bestimmte Zeilen und Spalten gleichzeitig mit .loc[row_indexer, column_list] auswählen. Bei einem MultiIndex ist der Zeilenindexer ein Tupel, eine Tupelliste oder ein IndexSlice, während der Spaltenindexer ein Spaltenname oder eine Liste von Namen ist. So können Sie in einem einzigen Ausdruck eine präzise rechteckige Teiltabelle aus einem hierarchischen DataFrame extrahieren.

import pandas as pd
import numpy as np

countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({
    'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000],
    'inflation': [1.5, 2.1, 2.8, 2.0, 3.4, 2.9, 3.2, 5.1, 4.8],
    'unemployment': [5.0, 4.8, 4.5, 4.5, 4.2, 4.0, 3.8, 3.5, 3.3]
}, index=mi)

idx = pd.IndexSlice

# UK and USA, years 2022-2023, only gdp and inflation
result = df.loc[idx['UK':'USA', 2022:2023], ['gdp', 'inflation']]
print(result)

Kurzer Test

Testen Sie Ihr Verständnis der Auswahl mit MultiIndex aus dieser Lektion.

Zusammenfassung der Lektion

In dieser Lektion haben Sie gelernt: Verwenden Sie .loc mit Tupeln, um bestimmte Kombinationen aus äußerer und innerer Beschriftung auszuwählen, pd.IndexSlice für Bereichs-Slices über beliebige Ebenen und .xs(), um unabhängig von äußeren Schlüsseln einen Querschnitt auf jeder Ebene zu extrahieren. Sortieren Sie den Index immer zuerst, um UnsortedIndexError zu vermeiden. Als Nächstes sehen wir uns Indexausrichtung und Reindexierung an – also wie Pandas zwei DataFrames an einem gemeinsamen Index ausrichtet.

Kostenlos starten

Lerne Python mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
30
Lektionen
120

Häufig gestellte Fragen

Ist die Lektion „Daten aus einem MultiIndex auswählen“ kostenlos?

Ja — der vollständige Text von „Daten aus einem MultiIndex auswählen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Pandas & NumPy Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Daten aus einem MultiIndex auswählen“?

Rufen Sie Daten auf äußeren und inneren Indexebenen mit .loc, Tupeln, Slices und dem Hilfsobjekt pd.IndexSlice ab. Du übst Pandas & NumPy Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Pandas & NumPy Academy zu starten?

Keine Vorkenntnisse erforderlich. Pandas & NumPy Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Daten aus einem MultiIndex auswählen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Pandas & NumPy Academy-Lektion Code schreiben und ausführen?

Ja. Jede Pandas & NumPy Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Einen MultiIndex erstellen
  2. Daten aus einem MultiIndex auswählen
  3. Indexausrichtung und Reindexierung
  4. Leistungsvorteile sortierter Indizes
← Zurück zu Pandas & NumPy Academy