Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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, melt en wide ↔ long.
  • Gecombineerd gebruik met groupby, pivot_table en 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

  • unstack kan NaN introduceren voor ontbrekende combinaties; gebruik fill_value= of fillna.
  • 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/melt om tussen long en wide te transformeren.
  • Combineer met groupby en pivot_table voor krachtige samenvattingen.