Pandas & NumPy Academy · Les

Waarden rangschikken

Wijs rangnummers toe aan kolomwaarden met rank(), kies methoden om gelijke waarden te verwerken en maak percentielklassen met pd.cut().

Les 3 van 413 stappen

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.0

Oplopende 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.0

Methoden 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           3

Percentielrang 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.0

Rangschikken 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          2

pd.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       Senior

pd.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    5

cut() 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 disproportionate

Korte 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.

Gratis beginnen

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

  1. Sorteren op kolomwaarden
  2. Sorteren op index
  3. Waarden rangschikken
  4. De index instellen en herstellen
← Terug naar Pandas & NumPy Academy