Hoofdstuk 20 — Geavanceerde indexen: MultiIndex en reshaping (stack/unstack/melt)
Let op: De tekst is in het Nederlands; alle Python codevoorbeelden zijn in het Engels.
Doel van dit hoofdstuk:
- Begrijpen en gebruiken van MultiIndex voor rijen en kolommen.
- Reshaping‑technieken:
stack,unstack,meltenwide↔long. - Gecombineerd gebruik met
groupby,pivot_tableen sorteren. - Praktische patronen voor analyse en rapportage.
Aanbevolen voorkennis: Hoofdstuk 13–19.
20.1 MultiIndex maken en basisoperaties
import pandas as pd
import numpy as np
arrays = [
['EU','EU','US','US'],
['A','B','A','B']
]
idx = pd.MultiIndex.from_arrays(arrays, names=['region','product'])
s = pd.Series([10, 12, 9, 11], index=idx)
# Selectie
sel_eu = s.loc['EU']
sel_us_a = s.loc[('US','A')]
# Sorteren en herindexeren
s_sorted = s.sort_index()
20.2 MultiIndex op DataFrame kolommen
data = pd.DataFrame({
('sales','qty'): [2,3,1,5],
('sales','price'): [10.0, 12.0, 9.0, 11.0],
('meta','region'): ['EU','EU','US','US']
})
data.columns = pd.MultiIndex.from_tuples(data.columns)
20.3 Stack en unstack
unstack verplaatst een niveau van de rijindex naar kolommen; stack doet het omgekeerde.
# Van long (MultiIndex rows) naar wide (kolommen)
df = s.reset_index(name='value').set_index(['region','product'])
unstacked = df['value'].unstack('product') # kolommen A, B
# Terug naar long
stacked = unstacked.stack().rename('value').reset_index()
20.4 Melt: wide naar long
wide = pd.DataFrame({
'id': [1,2,3],
'A_qty': [5,3,1],
'B_qty': [2,4,6]
})
long = (wide
.melt(id_vars='id', var_name='var', value_name='qty')
.assign(product=lambda d: d['var'].str[0])
.drop(columns=['var'])
)
20.5 Combineren met groupby en pivot_table
raw = pd.DataFrame({
'region': ['EU','EU','US','US','EU'],
'product': ['A','B','A','B','A'],
'qty': [2,3,1,5,4]
})
pt = pd.pivot_table(raw, index='region', columns='product', values='qty', aggfunc='sum', fill_value=0)
# MultiIndex kolommen flattenen
pt.columns = pt.columns.astype(str)
pt_reset = pt.reset_index()
20.6 Index‑niveau’s hernoemen en wisselen
midx = df.index # ['region','product']
renamed = df.rename_axis(index={'region':'reg','product':'prod'})
swapped = df.reorder_levels(['product','region']).sort_index()
20.7 Veelvoorkomende valkuilen
unstackkan NaN introduceren voor ontbrekende combinaties; gebruikfill_value=offillna.- Let op volgorde van index‑niveaus bij selectie en sorteren; gebruik
swaplevel/reorder_levels. - Kolom‑MultiIndex maakt code cryptischer; flatten kolomnamen waar zinvol.
20.8 Samenvatting
- MultiIndex ondersteunt hiërarchische labeling voor flexibele selectie en reshaping.
- Gebruik
stack/unstack/meltom tussen long en wide te transformeren. - Combineer met
groupbyenpivot_tablevoor krachtige samenvattingen.