Waarden rangschikken
Wijs rangnummers toe aan kolomwaarden met rank(), kies methoden om gelijke waarden te verwerken en maak percentielklassen met pd.cut().
Waarden rangschikken 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.
Wat is rangschikken?
Met rangschikken krijgt elke waarde in een Series een positie op basis van de relatieve grootte — rang 1 voor de kleinste waarde en rang n voor de grootste (of andersom). In tegenstelling tot sorteren, waarbij rijen opnieuw worden geordend, voegt rank() een nieuwe kolom met rangposities toe naast de oorspronkelijke gegevens. Rangen worden gebruikt voor klassementen, het berekenen van percentielen en bepaalde statistische toetsen waarvoor een rangpositie nodig is in plaats van absolute waarden.
import pandas as pd
df = pd.DataFrame({
'player': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve'],
'score': [88, 72, 95, 72, 85]
})
df['rank'] = df['score'].rank()
print(df)
# player score rank
# 0 Alice 88 4.0
# 1 Bob 72 1.5 <- tied with Dave
# 2 Carol 95 5.0
# 3 Dave 72 1.5 <- tied with Bob
# 4 Eve 85 3.0Oplopende en aflopende rangorde
Standaard geeft rank() rang 1 aan de kleinste waarde (oplopend). Geef ascending=False door om rang 1 aan de grootste waarde toe te kennen (bijvoorbeeld de eerste plaats in een wedstrijd). Dit sluit aan bij de conventie 'eerste plaats = hoogste score' die wordt gebruikt in sport, klassementen en verkoopranglijsten.
import pandas as pd
df = pd.DataFrame({'score': [70, 95, 85, 60, 90]})
# Rank 1 = highest score
df['competition_rank'] = df['score'].rank(ascending=False)
print(df)
# score competition_rank
# 0 70 4.0
# 1 95 1.0
# 2 85 3.0
# 3 60 5.0
# 4 90 2.0Methoden voor het verbreken van gelijke standen
Wanneer meerdere rijen dezelfde waarde hebben (een gelijke stand), bepaalt de parameter method hoe de rangen worden toegekend. De opties zijn: 'average' (standaard — rijen met dezelfde waarde delen de gemiddelde rang), 'min' (alle rijen met dezelfde waarde krijgen de laagste rang), 'max' (alle rijen krijgen de hoogste rang), 'first' (de rij die het eerst voorkomt krijgt de lagere rang) en 'dense' (geen hiaten in rangnummers na een gelijke stand).
import pandas as pd
s = pd.Series([10, 20, 20, 30])
print('average:', s.rank(method='average').tolist()) # [1.0, 2.5, 2.5, 4.0]
print('min: ', s.rank(method='min').tolist()) # [1.0, 2.0, 2.0, 4.0]
print('max: ', s.rank(method='max').tolist()) # [1.0, 3.0, 3.0, 4.0]
print('first: ', s.rank(method='first').tolist()) # [1.0, 2.0, 3.0, 4.0]
print('dense: ', s.rank(method='dense').tolist()) # [1.0, 2.0, 2.0, 3.0]Dichte rangorde: geen hiaten na gelijke standen
De methode 'dense' is vooral nuttig wanneer je een rangorde zonder hiaten wilt. Met 'min' zorgen twee vermeldingen op de gedeelde 2e plaats ervoor dat de volgende rang 4 is (3 wordt overgeslagen). Met 'dense' is de volgende rang altijd 3, zodat de reeks doorlopend blijft. Een dichte rangorde is de standaard in de SQL-vensterfunctie DENSE_RANK() en wordt vaak gebruikt in klassementen.
import pandas as pd
df = pd.DataFrame({
'name': ['A', 'B', 'C', 'D', 'E'],
'score': [100, 80, 80, 60, 60]
})
df['dense_rank'] = df['score'].rank(method='dense', ascending=False).astype(int)
print(df)
# name score dense_rank
# 0 A 100 1
# 1 B 80 2
# 2 C 80 2 <- same score, same rank
# 3 D 60 3 <- next rank is 3, not 4
# 4 E 60 3Percentielrang met pct=True
Als je pct=True instelt in rank(), worden de rangen genormaliseerd naar het bereik [0, 1], waardoor je een percentielrang krijgt. Een waarde met percentielrang 0.8 is hoger dan 80% van de waarden in de kolom. Dit wordt gebruikt in financiën (percentielprestaties), bij beoordeling (scorepercentielen) en voor het detecteren van uitschieters.
import pandas as pd
df = pd.DataFrame({'score': [50, 70, 80, 90, 100]})
df['percentile'] = df['score'].rank(pct=True)
print(df)
# score percentile
# 0 50 0.2
# 1 70 0.4
# 2 80 0.6
# 3 90 0.8
# 4 100 1.0Rangschikken binnen groepen
Als je rangen onafhankelijk binnen elke groep wilt berekenen (bijvoorbeeld de salarisrang binnen elke afdeling), combineer je groupby() met rank(). Gebruik groupby().rank(); daarmee wordt de rangfunctie per groep toegepast en krijg je een Series die is uitgelijnd met de oorspronkelijke DataFrame-index — ideaal om een kolom met een rang binnen de groep toe te voegen.
import pandas as pd
df = pd.DataFrame({
'dept': ['Eng', 'Eng', 'HR', 'HR', 'Eng'],
'name': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve'],
'salary': [90000, 70000, 55000, 65000, 80000]
})
df['dept_rank'] = df.groupby('dept')['salary'].rank(
method='dense', ascending=False
).astype(int)
print(df.sort_values(['dept', 'dept_rank']))
# dept name salary dept_rank
# 0 Eng Alice 90000 1
# 4 Eng Eve 80000 2
# 1 Eng Bob 70000 3
# 3 HR Dave 65000 1
# 2 HR Carol 55000 2pd.cut() voor intervallen met gelijke breedte
pd.cut(series, bins) verdeelt een continue numerieke kolom in intervallen met gelijke breedte (bins) en wijst elke waarde aan een interval toe. Hiermee zet je een continue variabele om in een categorische variabele, wat nuttig is voor histogrammen, leeftijdsgroepen, inkomensklassen of elke taak waarbij discretisatie nodig is. Het resultaat is een Categoricals Series met intervallelabels.
import pandas as pd
df = pd.DataFrame({'age': [5, 15, 25, 35, 45, 55, 65, 75]})
df['age_group'] = pd.cut(df['age'], bins=[0, 18, 35, 60, 100],
labels=['Child', 'Young Adult', 'Middle Age', 'Senior'])
print(df)
# age age_group
# 0 5 Child
# 1 15 Child
# 2 25 Young Adult
# 3 35 Young Adult
# 4 45 Middle Age
# 5 55 Middle Age
# 6 65 Senior
# 7 75 Seniorpd.qcut() voor intervallen met gelijke frequentie
pd.qcut(series, q) verdeelt waarden in op kwantielen gebaseerde intervallen, waarbij elk interval ongeveer evenveel waarnemingen bevat. In tegenstelling tot pd.cut() (gelijke breedte) maakt pd.qcut() groepen van gelijke omvang — nuttig voor segmentatie op basis van percentielen, zoals decielscores, kwintielverdelingen of kwartielgroepen.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({'score': np.random.randint(40, 100, 20)})
# Split into 4 equal-frequency quartiles
df['quartile'] = pd.qcut(df['score'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
print(df['quartile'].value_counts().sort_index())
# Q1 5
# Q2 5
# Q3 5
# Q4 5cut() versus qcut() — belangrijkste verschillen
Gebruik pd.cut() wanneer je intervallen een natuurlijke betekenis binnen het domein hebben (bijvoorbeeld leeftijdsklassen 0-18, 18-35, 35-60) — de breedte van de intervallen is dan inhoudelijk van belang. Gebruik pd.qcut() wanneer je groepen van gelijke omvang wilt, ongeacht waar de grenzen vallen — bijvoorbeeld om klanten in de bovenste en onderste kwartielen in te delen. Een scheve verdeling levert met cut() zeer ongelijke groepen op, maar met qcut() groepen van gelijke omvang.
import pandas as pd
import numpy as np
np.random.seed(0)
# Skewed distribution: most values near 0
skewed = pd.Series(np.random.exponential(scale=5, size=100).round())
# cut with equal width: many empty or tiny upper bins
cut_counts = pd.cut(skewed, bins=4).value_counts().sort_index()
print('cut():', cut_counts.values)
# qcut with equal frequency: always 25 per group
qcut_counts = pd.qcut(skewed, q=4).value_counts().sort_index()
print('qcut():', qcut_counts.values)Rangnummer als kolom toevoegen
Een helder patroon om een gerangschikte uitvoertabel te maken is: sorteer aflopend, herstel de index naar een op 0 gebaseerde index, tel 1 op voor een voor mensen leesbare rangorde vanaf 1 en toon die naast de oorspronkelijke gegevens. Zo krijg je een presentatieklare ranglijst zonder hiaten en met duidelijke rangnummers.
import pandas as pd
df = pd.DataFrame({
'team': ['Falcons', 'Eagles', 'Hawks', 'Owls'],
'wins': [12, 9, 12, 7]
})
leaderboard = (
df
.sort_values('wins', ascending=False)
.reset_index(drop=True)
)
leaderboard.index = leaderboard.index + 1
leaderboard.index.name = 'place'
print(leaderboard)Rang als kenmerk voor machine learning
Kenmerken die naar rangen zijn omgezet zijn nuttig in machine learning omdat ze robuust zijn tegen uitschieters — een zeer grote of zeer kleine waarde krijgt een rang dicht bij een uiterste waarde, in plaats van de verdeling van het kenmerk scheef te trekken. Rangtransformatie wordt soms gebruikt als voorbewerking vóór modellen op basis van bomen, of wanneer de numerieke schaal niet betekenisvol is maar de relatieve volgorde wel.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'income': [30000, 50000, 70000, 1_000_000] # outlier at 1M
})
# Add rank as a feature
df['income_rank'] = df['income'].rank(pct=True)
print(df)
# income income_rank
# 0 30000 0.25
# 1 50000 0.50
# 2 70000 0.75
# 3 1000000 1.00
# The outlier has rank 1.0 — extreme but not disproportionateKorte controle
Test je begrip van het rangschikken van waarden in Pandas.
Samenvatting van de les
In deze les heb je geleerd dat rank() rangposities aan waarden toekent, dat method='dense' hiaten na gelijke standen voorkomt, dat pct=True percentielrangen in [0,1] oplevert en dat groupby().rank() rangen binnen groepen berekent. Gebruik pd.cut() voor intervallen met gelijke breedte en pd.qcut() voor intervallen met gelijke frequentie bij het discretiseren van continue variabelen. Hierna gaan we de DataFrame-index instellen en herstellen.
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 “Waarden rangschikken” gratis?
Ja — de volledige tekst van “Waarden rangschikken” 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 “Waarden rangschikken”?
Wijs rangnummers toe aan kolomwaarden met rank(), kies methoden om gelijke waarden te verwerken en maak percentielklassen met pd.cut(). 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 “Waarden rangschikken”?
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
- Sorteren op kolomwaarden
- Sorteren op index
- Waarden rangschikken
- De index instellen en herstellen