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
groupbyen aggregaties. - Meervoudige aggregaties en kolomnamen beheren.
- Pivoteren met
pivot,pivot_tableen 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=Truebij categoricals om lege combinaties te vermijden.
16.9 Samenvatting
groupbyvoor splits‑apply‑combine;agg,transform,filtervoor verschillende doelen.pivot_tableencrosstabvoor brede tabellen en frequenties.rollingenexpandingvoor vensterberekeningen.