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 16 — Groeperen, aggregeren en pivoteren (groupby en pivot_table)

Let op: De tekst is in het Nederlands; alle Python codevoorbeelden zijn in het Engels.

Doel van dit hoofdstuk:

  • Data groeperen en samenvatten met groupby en aggregaties.
  • Meervoudige aggregaties en kolomnamen beheren.
  • Pivoteren met pivot, pivot_table en kruistabellen (crosstab).
  • Window‑functies voor rollende/expanderende berekeningen.

Aanbevolen voorkennis: Hoofdstuk 13–15.

16.1 GroupBy: basisconcepten

groupby splitst data per sleutel, voert een operatie uit en combineert het resultaat.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'region': ['EU','EU','US','US','APAC','EU'],
    'product': ['A','B','A','B','A','A'],
    'qty': [2,3,1,5,2,4],
    'price': [10.0, 12.0, 9.0, 11.0, 8.5, 10.0]
})

# Totaal per regio
sales_by_region = df.groupby('region')['qty'].sum()

# Meerdere keys
sales_by_reg_prod = df.groupby(['region','product'])['qty'].sum()

16.2 Aggregaties en meervoudige stats

# Eenvoudige aggregaties
agg1 = df.groupby('region').agg(qty_sum=('qty','sum'), price_mean=('price','mean'))

# Meervoudige aggregaties per kolom
agg2 = df.groupby('product').agg({
    'qty': ['sum','mean','count'],
    'price': ['mean','min','max']
})

# Kolomnamen flattenen
agg2.columns = ['_'.join(col).strip() for col in agg2.columns.to_flat_index()]

16.3 Transform vs. aggregate

transform retourneert een Series aligned met de oorspronkelijke index (handig voor normalisatie per groep).

# Z‑score van qty per product
df['qty_z_per_product'] = (
    df.groupby('product')['qty']
      .transform(lambda s: (s - s.mean())/s.std())
)

16.4 Filteren op groepsniveau

# Houd alleen producten met totale qty >= 5
filtered = df.groupby('product').filter(lambda g: g['qty'].sum() >= 5)

16.5 Pivot en pivot_table

# pivot: geen aggregatie; vereist unieke combinaties
no_agg = pd.DataFrame({
    'day': ['Mon','Tue','Wed'],
    'product': ['A','A','A'],
    'qty': [5, 3, 7]
})
wide = no_agg.pivot(index='day', columns='product', values='qty')

# pivot_table: met aggregatie en duplicate handling
pt = pd.pivot_table(df, index='region', columns='product', values='qty', aggfunc='sum', fill_value=0)

16.6 Crosstab (frequentietabellen)

ct = pd.crosstab(df['region'], df['product'], margins=True, normalize='index')

16.7 Window‑functies: rolling en expanding

s = pd.Series([1, 2, 3, 4, 5], dtype='float64')
rolling_mean = s.rolling(window=3, min_periods=1).mean()
expanding_sum = s.expanding(min_periods=1).sum()

16.8 Prestaties en geheugen

  • Gebruik categorische dtypes voor group keys met veel herhaling.
  • Kies specifieke kolommen vóór groupby om geheugen te besparen.
  • Voor grote datasets: overweeg observed=True bij categoricals om lege combinaties te vermijden.

16.9 Samenvatting

  • groupby voor splits‑apply‑combine; agg, transform, filter voor verschillende doelen.
  • pivot_table en crosstab voor brede tabellen en frequenties.
  • rolling en expanding voor vensterberekeningen.