Tworzenie MultiIndex
Zbuduj hierarchiczny indeks wierszy za pomocą pd.MultiIndex.from_tuples lub set_index dla wielu kolumn, a następnie sprawdź jego poziomy.
Tworzenie MultiIndex to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 1 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.
Czym jest MultiIndex
MultiIndex (nazywany również indeksem hierarchicznym) umożliwia obiektom DataFrame lub Series biblioteki Pandas posiadanie wielu poziomów etykiet wierszy. Można go traktować jak klucz złożony w bazie danych: zamiast identyfikować wiersz pojedynczą etykietą, identyfikuje się go krotką, taką jak (country, city) lub (year, quarter). MultiIndex jest niezbędny do reprezentowania danych panelowych, przekrojowych szeregów czasowych oraz dowolnych zbiorów danych z naturalną dwupoziomową strukturą grupowania.
import pandas as pd
# A simple example: sales by country and city
data = {
'sales': [100, 200, 150, 300, 80, 120]
}
index = pd.MultiIndex.from_tuples(
[('USA', 'New York'), ('USA', 'Chicago'),
('UK', 'London'), ('UK', 'Manchester'),
('DE', 'Berlin'), ('DE', 'Munich')],
names=['country', 'city']
)
df = pd.DataFrame(data, index=index)
print(df)Tworzenie MultiIndex za pomocą from_tuples
pd.MultiIndex.from_tuples(list_of_tuples, names=) to najbardziej jawny sposób tworzenia obiektu MultiIndex. Każda krotka staje się jedną etykietą wiersza, a jej elementy stają się poziomami. Parametr names przypisuje etykietę do każdego poziomu (np. ['year', 'quarter']). Ta metoda jest przydatna, gdy mają Państwo wcześniej przygotowaną listę kluczy złożonych, których chcą użyć jako indeksu wierszy.
import pandas as pd
# Multi-level time index: year x quarter
tuples = [
(2022, 'Q1'), (2022, 'Q2'), (2022, 'Q3'), (2022, 'Q4'),
(2023, 'Q1'), (2023, 'Q2'), (2023, 'Q3'), (2023, 'Q4')
]
mi = pd.MultiIndex.from_tuples(tuples, names=['year', 'quarter'])
revenue = [120, 135, 145, 160, 130, 148, 162, 175]
df = pd.Series(revenue, index=mi, name='revenue_M')
print(df)Tworzenie MultiIndex za pomocą from_product
pd.MultiIndex.from_product(iterables, names=) tworzy obiekt MultiIndex na podstawie iloczynu kartezjańskiego wielu list — czyli każdej kombinacji elementów z list wejściowych. Jest to najwygodniejsza metoda, gdy w danych powinny występować wszystkie kombinacje poziomów. Na przykład wszystkie kombinacje 3 lat × 4 kwartałów × 5 regionów automatycznie tworzą zbilansowany panel zawierający 60 wierszy.
import pandas as pd
import numpy as np
years = [2021, 2022, 2023]
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
# Cartesian product: 3 years x 4 quarters = 12 combinations
mi = pd.MultiIndex.from_product([years, quarters], names=['year', 'quarter'])
print('Number of index entries:', len(mi))
print('First 6 entries:', mi[:6].tolist())
# Create a DataFrame with this index
df = pd.DataFrame({'revenue': np.random.randint(100, 200, 12)}, index=mi)
print('\n', df.head())Tworzenie MultiIndex za pomocą set_index
Najczęstszym praktycznym sposobem utworzenia MultiIndex jest rozpoczęcie od zwykłego obiektu DataFrame zawierającego kolumny grupowania, a następnie wywołanie df.set_index([col1, col2]). Powoduje to przekształcenie tych kolumn z kolumn danych w poziomy indeksu. Wynik jest taki sam, jak gdyby indeks został utworzony od podstaw za pomocą from_tuples, ale w przypadku danych tabelarycznych wymaga tylko jednego wiersza kodu.
import pandas as pd
# Start with a flat DataFrame
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]
})
# Promote two columns to a MultiIndex
df = df_flat.set_index(['country', 'year'])
print(df)
print('\nIndex type:', type(df.index).__name__)
print('Index names:', df.index.names)Sprawdzanie poziomów MultiIndex
MultiIndex przechowuje dane w poziomach (unikatowych wartościach na każdym poziomie) oraz kodach (całkowitoliczbowych wskaźnikach do tablic poziomów). Poziomy można sprawdzić za pomocą df.index.levels lub df.index.get_level_values(level). Użyj df.index.nlevels, aby sprawdzić liczbę istniejących poziomów. Atrybut names zawiera nazwy przypisane do poszczególnych poziomów — można je ustawić za pomocą df.index.set_names(['level0', 'level1']).
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA', 'USA', 'UK', 'UK'],
'year': [2022, 2023, 2022, 2023],
'gdp': [25000, 26000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year'])
print('Number of levels:', df.index.nlevels)
print('Level names:', df.index.names)
print('Level 0 values:', df.index.get_level_values(0).tolist())
print('Level 1 values:', df.index.get_level_values(1).tolist())
print('Unique level 0:', df.index.get_level_values('country').unique().tolist())MultiIndex w kolumnach
MultiIndex można również zastosować do kolumn, tworząc hierarchię etykiet kolumn. Jest to częste w przypadku przechowywania wielu miar dla każdej kategorii w układzie przypominającym tabelę przestawną — na przykład (revenue, Q1), (revenue, Q2), (cost, Q1), (cost, Q2). Do kolumn z MultiIndex uzyskuje się dostęp tak samo jak do wierszy — za pomocą krotek. MultiIndex kolumn można utworzyć za pomocą pd.MultiIndex.from_product i przypisać go do df.columns.
import pandas as pd
import numpy as np
# Create a DataFrame with MultiIndex columns
metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
col_index = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
data = np.random.randint(50, 200, size=(3, 8))
df = pd.DataFrame(data, columns=col_index, index=['USA', 'UK', 'DE'])
df.index.name = 'country'
print(df)MultiIndex po agregacji GroupBy
Po wywołaniu groupby([col1, col2]).agg(...) wynikowy obiekt DataFrame ma MultiIndex w wierszach (dwa klucze groupby stają się dwoma poziomami indeksu) oraz potencjalnie MultiIndex w kolumnach (jeśli agregowanych jest wiele miar). Jest to najczęstszy sposób napotkania MultiIndex w codziennej analizie danych — zrozumienie sposobu poruszania się po nim jest niezbędne podczas pracy z wynikami groupby.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
# Two-key groupby creates a MultiIndex on rows
result = tips.groupby(['day', 'time'])['total_bill'].agg(['mean', 'count'])
print(result)
print('\nIndex type:', type(result.index).__name__)
print('Index names:', result.index.names)Zamiana i zmiana kolejności poziomów
Użyj df.swaplevel(), aby zamienić dwa poziomy indeksu, oraz df.reorder_levels([...]), aby zmienić kolejność wszystkich poziomów. Zmiana kolejności jest przydatna, gdy chcą Państwo najpierw filtrować dane według wewnętrznego poziomu lub gdy dwa obiekty DataFrame mają poziomy indeksu w innej kolejności i trzeba je wyrównać przed scaleniem. Po zmianie kolejności zawsze wywołuj sort_index(), aby przywrócić porządek leksykograficzny zapewniający wydajne wycinanie.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('Original levels:', result.index.names)
# Swap so time is the outer level
swapped = result.swaplevel().sort_index()
print('\nSwapped levels:', swapped.index.names)
print(swapped.head())Sprawdzanie i sortowanie MultiIndex
Wycinanie fragmentu MultiIndex jest wydajne tylko wtedy, gdy indeks jest posortowany leksykograficznie. Sprawdź, czy indeks jest posortowany, za pomocą df.index.is_monotonic_increasing. Jeśli zwróci False, posortuj indeks za pomocą df.sort_index(). Nieposortowany MultiIndex powoduje wyświetlenie ostrzeżenia PerformanceWarning podczas operacji wycinania i w niektórych sytuacjach brzegowych może zwrócić nieprawidłowe wyniki — zawsze sortuj indeks po utworzeniu lub zmodyfikowaniu MultiIndex.
import pandas as pd
# Create an unsorted MultiIndex deliberately
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)
print('Before sorting:')
print(df)
df_sorted = df.sort_index()
print('\nAfter sorting:')
print(df_sorted)
print('Is sorted:', df_sorted.index.is_monotonic_increasing)Przekształcanie MultiIndex z powrotem w kolumny
Wywołaj df.reset_index(), aby przekształcić wszystkie poziomy indeksu z powrotem w zwykłe kolumny, pozostawiając DataFrame ze standardowym całkowitym RangeIndex. Jest to częsty wzorzec po agregacjach groupby: najpierw oblicz podsumowanie grupowania z użyciem MultiIndex, a następnie zresetuj indeks, aby uzyskać płaski DataFrame odpowiedni do dalszych operacji Pandas, scalania lub eksportu do CSV. Użyj reset_index(level='name'), aby zresetować tylko jeden poziom indeksu dwupoziomowego.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('MultiIndex result:')
print(result.head(4))
# Flatten back to a regular DataFrame
flat = result.reset_index()
print('\nFlattened DataFrame:')
print(flat.head(4))
print('Index type:', type(flat.index).__name__)Kiedy używać MultiIndex
Użyj MultiIndex, gdy dane mają naturalną hierarchiczną strukturę: szeregi czasowe o częstotliwości mniejszej niż dobowa (data + godzina), dane panelowe (obiekt + okres) lub zagnieżdżone grupowania (kraj + region + miasto). Unikaj MultiIndex w przypadku prostych kluczy grupowania złożonych z dwóch kolumn, gdy płaski DataFrame z oddzielnymi kolumnami jest równie czytelny. Jeśli stale wywołujesz reset_index() tylko po to, aby uzyskać dostęp do danych, oznacza to, że MultiIndex prawdopodobnie nie wnosi wartości do używanego przepływu pracy.
Szybkie sprawdzenie
Sprawdź swoje zrozumienie tworzenia MultiIndex na podstawie tej lekcji.
Podsumowanie lekcji
W tej lekcji poznali Państwo: MultiIndex zapewnia hierarchiczne etykiety wierszy (lub kolumn) z użyciem krotek. Można go tworzyć za pomocą from_tuples, from_product lub set_index dla wielu kolumn. Indeks należy zawsze sortować, aby zapewnić wydajne wycinanie. Następnie omówimy wybieranie danych z MultiIndex za pomocą .loc, krotek, wycinków i pomocnika IndexSlice.
Często zadawane pytania
Czy lekcja „Tworzenie MultiIndex” jest bezpłatna?
Tak — pełny tekst „Tworzenie 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 „Tworzenie MultiIndex”?
Zbuduj hierarchiczny indeks wierszy za pomocą pd.MultiIndex.from_tuples lub set_index dla wielu kolumn, a następnie sprawdź jego poziomy. Ć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 1 z 4.
Ile czasu zajmuje lekcja „Tworzenie 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
- Tworzenie MultiIndex
- Wybieranie danych z MultiIndex
- Wyrównywanie indeksów i zmiana indeksu
- Korzyści z wydajności posortowanych indeksów