Hoofdstuk 18 — Samenvoegen en joinen: merge, concat en align
Let op: De tekst is in het Nederlands; alle Python codevoorbeelden zijn in het Engels.
Doel van dit hoofdstuk:
- Tabelverbindingen uitvoeren met
merge(inner/left/right/outer/indicator, suffixes). - Verticale/horizontale concatenatie met
concaten uitlijning met indexen. - Uitlijning en wiskunde tussen tabellen met verschillende indexen/labels (
align). - Geavanceerde joins: many‑to‑many, validatie en performance‑tips.
Aanbevolen voorkennis: Hoofdstuk 13–17.
18.1 Merge basis
import pandas as pd
left = pd.DataFrame({'id': [1,2,3], 'name': ['Alice','Bob','Charlie']})
right = pd.DataFrame({'id': [1,2,2,4], 'score': [88, 92, 85, 77]})
inner = pd.merge(left, right, on='id', how='inner')
left_join = pd.merge(left, right, on='id', how='left')
outer = pd.merge(left, right, on='id', how='outer', indicator=True)
18.2 Merge op verschillende kolomnamen en suffixes
sales = pd.DataFrame({'prod_id':[1,2], 'qty':[5,3]})
prods = pd.DataFrame({'id':[1,2], 'name':['A','B']})
merged = sales.merge(prods, left_on='prod_id', right_on='id', how='left', suffixes=('_s','_p'))
18.3 Many‑to‑one, one‑to‑one en many‑to‑many validatie
# validatie dwingt relatie af en voorkomt onverwachte duplicatie
mto = left.merge(right, on='id', how='left', validate='one_to_many')
oto = left.merge(left, on='id', how='left', validate='one_to_one')
18.4 Concat: stapelen en naast elkaar zetten
# Verticaal stapelen (rijen)
part1 = pd.DataFrame({'id':[1,2], 'qty':[5,3]})
part2 = pd.DataFrame({'id':[3,4], 'qty':[2,7]})
stacked = pd.concat([part1, part2], axis=0, ignore_index=True)
# Horizontaal (kolommen)
feat1 = pd.DataFrame({'id':[1,2,3], 'a':[10,20,30]})
feat2 = pd.DataFrame({'id':[1,2,3], 'b':[5,6,7]})
joined = pd.concat([feat1.set_index('id'), feat2.set_index('id')], axis=1).reset_index()
18.5 Align: uitlijning voor wiskunde
s1 = pd.Series([1, 2, 3], index=['a','b','c'])
s2 = pd.Series([10, 20, 30], index=['b','c','d'])
# Align retourneert gere‑indexeerde kopieën
A, B = s1.align(s2, join='outer', fill_value=0)
result = A + B
18.6 Joins op index
left_i = left.set_index('id')
right_i = right.set_index('id')
joined_i = left_i.join(right_i, how='left', lsuffix='_l', rsuffix='_r')
18.7 Prestatie, geheugen en valkuilen
- Zet join keys naar een compact dtype (bijv.
int32,category) voor minder geheugen. - Sorteer op keys voor snellere merges in sommige gevallen.
- Controleer duplicaten en cardinaliteit; gebruik
validateom onverwachte cartesiaanse explosies te voorkomen. - Bij concat: gebruik
ignore_index=Trueom herindexering te voorkomen.
18.8 Samenvatting
mergevoor SQL‑achtige joins;concatvoor stapelen of kolommen combineren.alignvoor veilige wiskunde met verschillende indexen.- Let op relatie‑type validatie en geheugenoptimalisaties.