0Pricing
Pandas & NumPy Academy · Lekcja

Wybieranie danych z MultiIndex

Pobieraj dane z zewnętrznych i wewnętrznych poziomów indeksu za pomocą .loc, używając krotek, wycinków i pomocnika pd.IndexSlice.

Wybieranie danych z MultiIndex to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Poruszanie się po danych hierarchicznych

Po utworzeniu MultiIndex potrzebują Państwo wydajnych sposobów pobierania podzbiorów danych. Pandas udostępnia w tym celu trzy narzędzia: .loc z krotkami do wybierania dokładnych etykiet, slice() i pd.IndexSlice do wybierania zakresów na wielu poziomach oraz .xs() do wybierania przekroju dla konkretnej wartości poziomu. Opanowanie tych sposobów dostępu pozwala w pełni wykorzystać możliwości indeksowania hierarchicznego.

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)

Wybieranie według poziomu zewnętrznego za pomocą .loc

Przekaż pojedynczą etykietę poziomu zewnętrznego do .loc[], aby pobrać wszystkie wiersze należące do tej grupy. W przypadku dwupoziomowego MultiIndex (kraj, rok) wyrażenie df.loc['USA'] zwraca wszystkie wiersze dotyczące USA jako DataFrame, w którym pozostaje tylko indeks wewnętrzny (rok). To zachowanie nazywa się usuwaniem poziomu — po wybraniu konkretnej wartości poziomu zewnętrznego Pandas usuwa ten poziom z indeksu zwracanego obiektu.

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)

Wybieranie konkretnej krotki za pomocą .loc

Aby pobrać pojedynczy wiersz identyfikowany przez oba poziomy indeksu, przekaż krotkę do .loc[]: df.loc[('USA', 2022)]. Zwraca to Series (lub skalar w przypadku pojedynczej kolumny) odpowiadający dokładnie kombinacji etykiet (zewnętrzna, wewnętrzna). Jeśli chcą Państwo otrzymać DataFrame zamiast Series, należy umieścić krotkę na liście: df.loc[[('USA', 2022)]].

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)]])

Wybieranie wielu wierszy za pomocą listy krotek

Aby jednocześnie wybrać wiele konkretnych wierszy, przekaż listę krotek do .loc[]. Jest to przydatne, gdy potrzebują Państwo nieciągłego podzbioru wierszy identyfikowanych przez klucze złożone — na przykład danych z 2022 roku dla USA i Wielkiej Brytanii, ale nie dla Niemiec. Wynik zachowuje MultiIndex w zwróconym DataFrame.

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)

Wycinanie za pomocą pd.IndexSlice

pd.IndexSlice (często przypisywany do aliasu idx) pozwala zapisywać wycinki zakresów dla poziomów MultiIndex bez ręcznego konstruowania rozwlekłych krotek wycinków. Składnia: df.loc[idx[outer_slice, inner_slice], column_slice]. Na przykład df.loc[idx['UK':'USA', 2022:2023], :] wybiera wszystkie wiersze, w których poziom zewnętrzny mieści się między UK a USA, a poziom wewnętrzny między 2022 a 2023. Aby działało to poprawnie, indeks musi być posortowany.

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)

Dostęp do przekroju za pomocą .xs()

df.xs(key, level=) wybiera wszystkie wiersze, w których konkretny poziom ma podaną wartość, niezależnie od zawartości pozostałych poziomów. W przeciwieństwie do .loc, które wymaga najpierw określenia poziomów zewnętrznych, .xs umożliwia bezpośredni dostęp do dowolnego poziomu po nazwie. Na przykład df.xs(2022, level='year') zwraca wszystkie wiersze z 2022 roku dla wszystkich krajów bez konieczności określania wartości 'USA', 'UK' lub 'DE'.

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'))

Dostęp do kolumn MultiIndex

Gdy DataFrame ma MultiIndex kolumn, użyj krotek, aby uzyskać dostęp do konkretnych kolumn: df[('revenue', 'Q1')]. Aby wybrać wszystkie kolumny na poziomie zewnętrznym (np. wszystkie kolumny dotyczące przychodu), użyj df['revenue'], które zwraca DataFrame ze wszystkimi kolumnami poziomu wewnętrznego należącymi do tego klucza zewnętrznego. Wzorzec pd.IndexSlice działa również z wielopoziomowymi indeksami kolumn w połączeniu z .loc.

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')])

Wybieranie poziomu wewnętrznego dla wszystkich kluczy zewnętrznych

Aby wybrać pojedynczą wartość poziomu wewnętrznego dla wszystkich wartości poziomu zewnętrznego, połącz .loc z slice(None) dla poziomu zewnętrznego: df.loc[(slice(None), 2022), :]. Spowoduje to wybranie wiersza z 2022 roku dla każdego kraju. Wersja z użyciem pd.IndexSlice jest czytelniejsza: df.loc[idx[:, 2022], :]. Ten wzorzec jest często potrzebny, gdy chcą Państwo pobrać migawkę wszystkich obiektów dla konkretnego momentu.

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)

Typowe problemy przy wybieraniu danych z MultiIndex

Trzy typowe problemy: 1) Nieposortowany indeks: wycinanie z nieposortowanego MultiIndex powoduje błąd UnsortedIndexError lub zwraca nieprawidłowe wyniki — zawsze najpierw wywołaj sort_index(). 2) KeyError przy użyciu krotki jako klucza: jeśli przekażesz krotkę bez umieszczenia jej w .loc[], Python zinterpretuje ją jako indeksowanie pozycyjne — do dostępu do MultiIndex na podstawie etykiet zawsze używaj .loc. 3) Niezgodność poziomów: po użyciu groupby nazwy poziomów MultiIndex mogą różnić się od oczekiwanych — przed wycinaniem sprawdź 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', :], :])

Przykład praktyczny: raportowanie kwartalne

Konkretny przypadek użycia: mają Państwo dane sprzedażowe indeksowane według (region, kwartał) i muszą wyodrębnić czwarty kwartał ze wszystkich regionów na potrzeby raportu na koniec roku. Użyj .xs('Q4', level='quarter'), aby pobrać ten przekrój jednym wywołaniem. Następnie oblicz sumę za pomocą .sum(). Ten wzorzec — agregacja groupby → wynik MultiIndex → wyodrębnienie przekroju — jest niezwykle często spotykany w potokach raportowania biznesowego.

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())

Łączenie wybierania danych z MultiIndex z wybieraniem kolumn

Można jednocześnie wybierać konkretne wiersze i kolumny za pomocą .loc[row_indexer, column_list]. W przypadku MultiIndex selektor wierszy jest krotką, listą krotek lub IndexSlice, a selektor kolumn jest nazwą kolumny albo listą nazw. Pozwala to wyodrębnić precyzyjny prostokątny podzbiór hierarchicznego DataFrame za pomocą pojedynczego wyrażenia.

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)

Szybkie sprawdzenie

Sprawdź swoje zrozumienie wybierania danych z MultiIndex na podstawie tej lekcji.

Podsumowanie lekcji

W tej lekcji poznali Państwo: używanie .loc z krotkami do wybierania konkretnych kombinacji etykiet (zewnętrzna, wewnętrzna), pd.IndexSlice do wycinania zakresów na dowolnych poziomach oraz .xs() do wyodrębniania przekroju na dowolnym poziomie, niezależnie od kluczy zewnętrznych. Zawsze najpierw sortuj indeks, aby uniknąć błędu UnsortedIndexError. Następnie omówimy wyrównywanie indeksów i ponowne indeksowanie — sposób, w jaki Pandas dopasowuje dwa DataFrame do wspólnego indeksu.

Często zadawane pytania

Czy lekcja „Wybieranie danych z MultiIndex” jest bezpłatna?

Tak — pełny tekst „Wybieranie danych z MultiIndex” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wybieranie danych z MultiIndex”?

Pobieraj dane z zewnętrznych i wewnętrznych poziomów indeksu za pomocą .loc, używając krotek, wycinków i pomocnika pd.IndexSlice. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Wybieranie danych z MultiIndex”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie MultiIndex
  2. Wybieranie danych z MultiIndex
  3. Wyrównywanie indeksów i zmiana indeksu
  4. Korzyści z wydajności posortowanych indeksów
← Powrót do Pandas & NumPy Academy