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 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 concat en 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 validate om onverwachte cartesiaanse explosies te voorkomen.
  • Bij concat: gebruik ignore_index=True om herindexering te voorkomen.

18.8 Samenvatting

  • merge voor SQL‑achtige joins; concat voor stapelen of kolommen combineren.
  • align voor veilige wiskunde met verschillende indexen.
  • Let op relatie‑type validatie en geheugenoptimalisaties.