Pandas & NumPy Academy · Les

Gegevens uit een MultiIndex selecteren

Haal gegevens op uit de buitenste en binnenste indexniveaus met .loc, tuples, slices en de helper pd.IndexSlice.

Les 2 van 413 stappen

Gegevens uit een MultiIndex selecteren is een gratis Pandas & NumPy Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Pandas & NumPy Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.

Navigeren door hiërarchische gegevens

Als je een MultiIndex hebt, heb je efficiënte manieren nodig om subsets van gegevens op te halen. Pandas biedt hiervoor drie hulpmiddelen: .loc met tupels voor het selecteren van exacte labels, slice() en pd.IndexSlice voor bereikselecties over niveaus heen, en .xs() voor het selecteren van een dwarsdoorsnede op een specifieke niveauwaarde. Als je deze toegangs­­patronen beheerst, benut je de volledige kracht van hiërarchische indexering.

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)

Selecteren op het buitenste niveau met .loc

Geef een enkel label van het buitenste niveau door aan .loc[] om alle rijen voor die groep op te halen. Bij een MultiIndex met twee niveaus (land, jaar) retourneert df.loc['USA'] alle rijen voor de VS als een DataFrame, waarbij alleen de binnenste index (jaar) overblijft. Dit gedrag heet niveau verwijderen: wanneer je een specifieke waarde op een buitenste niveau selecteert, verwijdert Pandas dat niveau uit de index van het geretourneerde object.

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)

Een specifiek tupel selecteren met .loc

Als je één rij wilt ophalen die door beide indexniveaus wordt geïdentificeerd, geef je een tupel door aan .loc[]: df.loc[('USA', 2022)]. Dit retourneert een Series (of een scalaire waarde voor één kolom) die precies overeenkomt met die combinatie van (buitenste, binnenste) labels. Je moet het tupel in een lijst plaatsen met df.loc[[('USA', 2022)]] als je een DataFrame in plaats van een Series wilt terugkrijgen.

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

Meerdere rijen selecteren met een lijst tupels

Als je meerdere specifieke rijen tegelijk wilt selecteren, geef je een lijst met tupels door aan .loc[]. Dit is handig wanneer je een niet-aaneengesloten subset van rijen nodig hebt die door samengestelde sleutels wordt geïdentificeerd, bijvoorbeeld de gegevens van 2022 voor de VS en het VK, maar niet voor Duitsland. Het resultaat behoudt de MultiIndex in het geretourneerde 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)

Slicen met pd.IndexSlice

Met pd.IndexSlice (vaak afgekort als idx) kun je bereikslices voor MultiIndex-niveaus schrijven zonder omslachtige tupelslices handmatig samen te stellen. Syntaxis: df.loc[idx[outer_slice, inner_slice], column_slice]. Met df.loc[idx['UK':'USA', 2022:2023], :] selecteer je bijvoorbeeld alle rijen waarvoor het buitenste niveau tussen het VK en de VS ligt en het binnenste niveau tussen 2022 en 2023. De index moet hiervoor correct gesorteerd zijn.

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)

Dwarsdoorsneden ophalen met .xs()

df.xs(key, level=) selecteert alle rijen waarvoor een specifiek niveau gelijk is aan een bepaalde waarde, ongeacht de inhoud van andere niveaus. In tegenstelling tot .loc, waarvoor je eerst de buitenste niveaus moet opgeven, kan .xs rechtstreeks elk niveau op naam benaderen. Zo retourneert df.xs(2022, level='year') alle rijen van 2022 voor alle landen, zonder dat je 'USA', 'UK' of 'DE' hoeft op te geven.

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

Toegang tot MultiIndex-kolommen

Wanneer een DataFrame een MultiIndex voor kolommen heeft, gebruik je tupels om specifieke kolommen te benaderen: df[('revenue', 'Q1')]. Als je alle kolommen op een buitenste niveau wilt selecteren, bijvoorbeeld alle omzetkolommen, gebruik je df['revenue']. Dit retourneert een DataFrame met alle kolommen van het binnenste niveau onder die buitenste sleutel. Het patroon met pd.IndexSlice werkt ook voor MultiIndex-kolommen in combinatie met .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')])

Het binnenste niveau selecteren voor alle buitenste sleutels

Als je één waarde van het binnenste niveau wilt selecteren voor alle waarden van het buitenste niveau, combineer je .loc met een slice(None) voor het buitenste niveau: df.loc[(slice(None), 2022), :]. Hiermee selecteer je de rij van 2022 voor elk land. De versie met pd.IndexSlice is beter leesbaar: df.loc[idx[:, 2022], :]. Dit patroon is vaak nodig wanneer je een momentopname wilt ophalen van alle entiteiten op een specifiek tijdstip.

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)

Veelvoorkomende valkuilen bij MultiIndex-selectie

Drie veelvoorkomende valkuilen: 1) Ongesorteerde index: het slicen van een MultiIndex die niet is gesorteerd, veroorzaakt een UnsortedIndexError of levert onjuiste resultaten op; roep altijd eerst sort_index() aan. 2) KeyError met een tupel als sleutel: als je een tupel doorgeeft zonder het in .loc[] te plaatsen, interpreteert Python het als positionele indexering; gebruik altijd .loc voor labelgebaseerde toegang tot een MultiIndex. 3) Niet-overeenkomend niveau: na groupby komen de namen van de MultiIndex-niveaus mogelijk niet overeen met wat je verwacht; controleer df.index.names voordat je slicet.

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

Praktijkvoorbeeld: kwartaalrapportage

Een concreet gebruiksscenario: je hebt verkoopgegevens met een index op (regio, kwartaal) en moet voor een jaareindrapport het vierde kwartaal voor alle regio's ophalen. Gebruik .xs('Q4', level='quarter') om deze dwarsdoorsnede in één aanroep te krijgen. Bereken daarna het totaal met .sum(). Dit patroon — aggregatie met groupby → MultiIndex-resultaat → dwarsdoorsnede ophalen — komt zeer vaak voor in rapportagewerkstromen voor bedrijven.

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-selectie combineren met kolommen

Je kunt specifieke rijen en kolommen tegelijk selecteren met .loc[row_indexer, column_list]. Bij een MultiIndex is de rij-indexeerder een tupel, een lijst met tupels of een IndexSlice, en de kolom-indexeerder een kolomnaam of een lijst met namen. Zo kun je in één expressie een precieze rechthoekige sub­tabel uit een hiërarchisch DataFrame ophalen.

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)

Korte controle

Toets je begrip van het selecteren uit een MultiIndex in deze les.

Samenvatting van de les

In deze les heb je geleerd dat je .loc met tupels gebruikt om specifieke combinaties van (buitenste, binnenste) labels te selecteren, pd.IndexSlice voor bereikselecties over willekeurige niveaus en .xs() om op elk niveau een dwarsdoorsnede op te halen, ongeacht de buitenste sleutels. Sorteer de index altijd eerst om UnsortedIndexError te voorkomen. Hierna bekijken we indexuitlijning en opnieuw indexeren: hoe Pandas twee DataFrames uitlijnt op een gemeenschappelijke index.

Gratis beginnen

Leer Python met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
30
Lessen
120

Veelgestelde vragen

Is de les “Gegevens uit een MultiIndex selecteren” gratis?

Ja — de volledige tekst van “Gegevens uit een MultiIndex selecteren” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Pandas & NumPy Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.

Wat leer ik in “Gegevens uit een MultiIndex selecteren”?

Haal gegevens op uit de buitenste en binnenste indexniveaus met .loc, tuples, slices en de helper pd.IndexSlice. Je oefent met Pandas & NumPy Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Pandas & NumPy Academy te beginnen?

Ervaring vooraf is niet nodig. Pandas & NumPy Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Gegevens uit een MultiIndex selecteren”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Pandas & NumPy Academy?

Ja. Elke les over Pandas & NumPy Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Een MultiIndex maken
  2. Gegevens uit een MultiIndex selecteren
  3. Indexuitlijning en herindexering
  4. Prestatievoordelen van gesorteerde indexen
← Terug naar Pandas & NumPy Academy