Indexuitlijning en herindexering
Lijn twee DataFrames uit op een gemeenschappelijke index met reindex(), vul ontbrekende labels aan en begrijp hoe rekenkundige bewerkingen indexen uitlijnen.
Indexuitlijning en herindexering is een gratis Pandas & NumPy Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Pandas & NumPy Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.
Hoe Pandas indexen uitlijnt
Een van de krachtigste — en soms verrassende — eigenschappen van Pandas is automatische indexuitlijning. Wanneer je twee Series of DataFrames optelt, aftrekt of anderszins combineert, lijnt Pandas ze eerst uit op hun indexlabels voordat de bewerking wordt uitgevoerd. Overeenkomende labels worden samen verwerkt; niet-overeenkomende labels leveren NaN op. Zo voorkom je stille fouten door verkeerd uitgelijnde gegevens en kun je gegevens uit verschillende bronnen veilig combineren zonder ze eerst handmatig te sorteren of opnieuw te ordenen.
import pandas as pd
s1 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s2 = pd.Series([1, 2, 3], index=['b', 'c', 'd'])
# Alignment in action: a→NaN, d→NaN
result = s1 + s2
print('s1 + s2 with automatic alignment:')
print(result)NaN door niet-uitgelijnde indexen
Wanneer indexlabels niet overeenkomen, vult Pandas de ontbrekende waarden aan met NaN. Dit is opzettelijk: het geeft aan dat er voor een van de operanden geen overeenkomstige waarde was. Controleer het resultaat van rekenkundige bewerkingen tussen twee Series of DataFrames altijd op onverwachte NaN-waarden; die wijzen op een verkeerd uitgelijnde index. Gebruik fill_value=0 in de rekenmethode (s1.add(s2, fill_value=0)) om ontbrekende uitgelijnde waarden als nul te behandelen in plaats van NaN door te geven.
import pandas as pd
s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})
# Default: NaN where labels don't match
print('Default (NaN for unmatched):')
print(s1 + s2)
# fill_value=0: treat missing as zero
print('\nWith fill_value=0:')
print(s1.add(s2, fill_value=0))Uitlijning bij rekenkundige bewerkingen op DataFrames
Uitlijning geldt voor zowel rijen als kolommen wanneer je twee DataFrames combineert. Het resultaat bevat de unie van beide indexverzamelingen en beide kolomverzamelingen, met NaN waar een van de DataFrames geen waarde had. Dit is gelijk aan een volledige outer join op index en kolommen tegelijk. Je kunt dus veilig DataFrames uit verschillende boekhoudkundige perioden optellen: maanden die in het ene maar niet in het andere voorkomen, krijgen NaN, die je vervolgens kunt aanvullen of verwijderen.
import pandas as pd
df1 = pd.DataFrame({'revenue': [100, 200], 'cost': [80, 150]}, index=['Jan', 'Feb'])
df2 = pd.DataFrame({'revenue': [120, 210], 'headcount': [5, 6]}, index=['Feb', 'Mar'])
result = df1 + df2
print('Combined DataFrame (union of index and columns):')
print(result)De methode reindex()
df.reindex(new_index) retourneert een nieuw DataFrame dat is aangepast aan de lijst met labels in new_index. Labels die zowel in de oorspronkelijke als in de nieuwe index staan, blijven behouden; labels die wel in new_index maar niet in de oorspronkelijke index staan, krijgen NaN; labels die wel in de oorspronkelijke index maar niet in new_index staan, worden verwijderd. Dit is de expliciete manier om een DataFrame uit te lijnen op een gewenste verzameling labels voordat je bewerkingen uitvoert.
import pandas as pd
s = pd.Series({'a': 10, 'b': 20, 'c': 30})
# Reindex to a new label set
reindexed = s.reindex(['b', 'c', 'd', 'e'])
print('Original:', s.index.tolist())
print('New index: [b, c, d, e]')
print('\nReindexed Series:')
print(reindexed)
# b, c preserved; d, e → NaN; a droppedOntbrekende waarden aanvullen na opnieuw indexeren
reindex() accepteert een parameter fill_value om een constante in te vullen voor nieuwe labels, en een parameter method voor voorwaarts aanvullen ('ffill') of achterwaarts aanvullen ('bfill'). Deze aanvulmethoden zijn vooral nuttig voor tijdreeksgegevens wanneer je een Series opnieuw indexeert naar een volledige datumbereik en ontbrekende dagen wilt vullen met de laatst bekende waarde in plaats van NaN.
import pandas as pd
# Sparse daily data with gaps
s = pd.Series(
[10, 20, 30],
index=pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-07'])
)
# Reindex to complete date range
full_range = pd.date_range('2024-01-01', '2024-01-07')
print('Forward fill (carry last known value):')
print(s.reindex(full_range, method='ffill'))
print('\nFill with 0:')
print(s.reindex(full_range, fill_value=0))Kolommen opnieuw indexeren
reindex werkt ook op kolommen: df.reindex(columns=['col1', 'col2', 'new_col']). Nieuwe kolommen die niet in het oorspronkelijke DataFrame staan, worden toegevoegd met NaN. Bestaande kolommen die niet in de nieuwe lijst staan, worden verwijderd. Dit is nuttig om een canoniek kolommenschema af te dwingen voor meerdere DataFrames uit verschillende bronnen, die mogelijk niet dezelfde kolommensets hebben.
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [30, 25],
'city': ['NY', 'LA']
})
# Enforce a canonical column order and add missing columns
canonical_cols = ['name', 'age', 'email', 'city', 'country']
df_reindexed = df.reindex(columns=canonical_cols)
print(df_reindexed)
# 'email' and 'country' are new → NaNalign() gebruiken om twee objecten te synchroniseren
s1.align(s2) retourneert twee nieuwe objecten met dezelfde index (unie of doorsnede, afhankelijk van de parameter join), zodat ze klaar zijn voor elementgewijze bewerkingen. Dit is gelijk aan het tegelijk opnieuw indexeren van beide objecten naar dezelfde verzameling labels. Gebruik join='inner' om alleen gemeenschappelijke labels te behouden, of join='outer' (de standaardwaarde) om alle labels uit beide objecten te behouden, met NaN voor niet-overeenkomsten.
import pandas as pd
s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})
# Align to common labels only (inner join)
s1_aligned, s2_aligned = s1.align(s2, join='inner')
print('Inner-aligned s1:')
print(s1_aligned)
print('Inner-aligned s2:')
print(s2_aligned)
print('\nProduct on common labels:')
print(s1_aligned * s2_aligned)Uitlijning bij merge versus rekenkundige bewerkingen
Pandas biedt twee manieren om DataFrames te combineren: merge/join (in SQL-stijl, met expliciete overeenkomst op sleutels) en rekenkundige bewerkingen met indexuitlijning (impliciet, op basis van labels). Gebruik merge voor het combineren van gestructureerde tabellen met expliciete sleutelkolommen. Gebruik rekenkundige uitlijning voor berekeningen tussen DataFrames die van nature dezelfde index delen, bijvoorbeeld wanneer je een kosten-DataFrame aftrekt van een omzet-DataFrame en beide zijn geïndexeerd op (regio, maand).
import pandas as pd
# Two DataFrames sharing the same index
revenue = pd.Series({'North': 500, 'South': 300, 'East': 450})
costs = pd.Series({'North': 350, 'South': 280, 'West': 400})
# Automatic alignment: 'East' and 'West' don't match → NaN
profit = revenue - costs
print('Profit by region:')
print(profit)
# If you want only common regions
profit_inner = revenue.align(costs, join='inner')[0] - revenue.align(costs, join='inner')[1]
print('\nProfit (common regions only):')
print(profit_inner)Indexgelijkheid controleren vóór bewerkingen
Controleer voordat je bewerkingen uitvoert op twee DataFrames of hun indexen overeenkomen met (df1.index == df2.index).all(). Als de indexen alleen in volgorde verschillen, sorteer je beide voordat je ze vergelijkt. Voor DataFrames die uit verschillende bronnen zijn geladen, is het een goede gewoonte om ze vóór rekenkundige bewerkingen expliciet uit te lijnen of opnieuw te indexeren, zodat je onbedoelde verspreiding van NaN voorkomt. Documenteer aannames over uitlijning in opmerkingen of logboeken van de werkstroom.
import pandas as pd
df1 = pd.DataFrame({'sales': [100, 200, 300]}, index=['Q1', 'Q2', 'Q3'])
df2 = pd.DataFrame({'cost': [80, 160, 240]}, index=['Q1', 'Q2', 'Q3'])
# Check index equality
if (df1.index == df2.index).all():
print('Indices match — safe to combine.')
combined = pd.concat([df1, df2], axis=1)
combined['profit'] = combined['sales'] - combined['cost']
print(combined)
else:
print('Indices differ — align before combining!')Praktisch patroon: vormen standaardiseren
Een veelgebruikt patroon bij het laden van gegevens uit meerdere bestanden of API-aanroepen is dat elke batch een andere subset van sleutels bevat. Indexeer alle batches vóór het samenvoegen of aggregeren opnieuw naar de volledige bekende sleutelruimte met fill_value=0. Zo heeft elke batch vóór de bewerkingen dezelfde vorm (dezelfde index en dezelfde kolommen), waardoor onopgemerkte verschillen in vorm die tot onjuiste geaggregeerde resultaten leiden, worden voorkomen.
import pandas as pd
# Two sales batches with different product sets
batch1 = pd.Series({'laptop': 50, 'phone': 80, 'tablet': 30})
batch2 = pd.Series({'phone': 90, 'tablet': 40, 'headphones': 60})
# Full product catalogue
all_products = ['laptop', 'phone', 'tablet', 'headphones']
# Standardise both to the full catalogue
b1 = batch1.reindex(all_products, fill_value=0)
b2 = batch2.reindex(all_products, fill_value=0)
total = b1 + b2
print('Total sales per product:')
print(total)Randgevallen bij indexuitlijning
Twee belangrijke randgevallen: Dubbele labels — als beide Series dubbele indexlabels hebben, leidt uitlijning tot een uitbreiding die lijkt op een cartesisch product, met veel NaN-waarden (Pandas neemt niet aan welke duplicaten bij elkaar horen). Zorg altijd dat indices uniek zijn voordat u rekenkundige uitlijning uitvoert. Integerindices versus objectindices — een RangeIndex(0,5) en een Int64Index([0,1,2,3,4]) worden na bewerkingen mogelijk niet perfect uitgelijnd, omdat de ene index wordt afgeleid en de andere expliciet is. Gebruik reset_index(drop=True) om ze te normaliseren.
import pandas as pd
# Duplicate label alignment — produces unexpected expansion
s1 = pd.Series([1, 2, 3], index=['a', 'a', 'b'])
s2 = pd.Series([10, 20], index=['a', 'b'])
result = s1 + s2
print('Result with duplicate indices (unexpected expansion):')
print(result)
print('\nAlways ensure unique indices before arithmetic!')Korte controle
Test uw begrip van indexuitlijning en herindexering uit deze les.
Samenvatting van de les
In deze les hebt u geleerd: Pandas voert automatische indexuitlijning uit bij rekenkundige bewerkingen en produceert NaN voor niet-overeenkomende labels, reindex() past een DataFrame aan een doelset met labels aan met opties om ontbrekende labels op te vullen, en align() synchroniseert twee objecten tegelijkertijd met dezelfde index. Hierna bekijken we de prestatievoordelen van gesorteerde indices en hoe u die met timeit meet.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “Indexuitlijning en herindexering” gratis?
Ja — de volledige tekst van “Indexuitlijning en herindexering” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Pandas & NumPy Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.
Wat leer ik in “Indexuitlijning en herindexering”?
Lijn twee DataFrames uit op een gemeenschappelijke index met reindex(), vul ontbrekende labels aan en begrijp hoe rekenkundige bewerkingen indexen uitlijnen. Je oefent met Pandas & NumPy Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Pandas & NumPy Academy te beginnen?
Ervaring vooraf is niet nodig. Pandas & NumPy Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Indexuitlijning en herindexering”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Pandas & NumPy Academy?
Ja. Elke les over Pandas & NumPy Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Een MultiIndex maken
- Gegevens uit een MultiIndex selecteren
- Indexuitlijning en herindexering
- Prestatievoordelen van gesorteerde indexen