Rangordna värden
Tilldela rang till kolumnvärden med rank(), välj metoder för att hantera lika värden och skapa percentilintervall med pd.cut().
Rangordna värden är en gratis lektion i Pandas & NumPy Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Pandas & NumPy Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.
Vad är rangordning?
Rangordning tilldelar varje värde i en Series en position baserat på dess relativa storlek — rang 1 för det minsta värdet och rang n för det största (eller tvärtom). Till skillnad från sortering, som ordnar om raderna, lägger rank() till en ny kolumn med ordningspositioner bredvid originaldata. Rangordning används i topplistor, percentilberäkningar och vissa statistiska tester som kräver en ordningsposition i stället för absoluta värden.
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.0Stigande respektive fallande rangordning
Som standard ger rank() rang 1 till det minsta värdet (stigande ordning). Om ni vill ge rang 1 till det största värdet (till exempel förstaplatsen i en tävling) anger ni ascending=False. Detta följer konventionen ”förstaplats = högst poäng” som används inom sport, topplistor och försäljningsrankningar.
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.0Metoder för att hantera lika värden
När flera rader har samma värde (delad placering) avgör parametern method hur rangerna tilldelas. Alternativen är: 'average' (standard — rader med samma värde delar på den genomsnittliga rangen), 'min' (alla rader med samma värde får den lägsta rangen), 'max' (alla får den högsta), 'first' (raden som visas först får den lägre rangen) och 'dense' (inga luckor i rangnumren efter lika värden).
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]Tät rangordning: inga luckor efter lika värden
Metoden 'dense' är särskilt användbar när ni vill ha en rangordning utan luckor. Med 'min' innebär två poster på delad andraplats att nästa rang blir 4 (rang 3 hoppas över). Med 'dense' blir nästa rang alltid 3, vilket ger en sammanhängande sekvens. Tät rangordning är standard i SQL:s fönsterfunktion DENSE_RANK() och används ofta i topplistor.
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 3Percentilrang med pct=True
Om ni anger pct=True i rank() normaliseras rangerna till intervallet [0, 1], vilket ger en percentilrang. Ett värde med percentilrangen 0.8 är högre än 80 % av värdena i kolumnen. Detta används inom ekonomi (percentilbaserad prestation), betygssättning (percentiler för poäng) och identifiering av avvikande värden.
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.0Rangordning inom grupper
Om ni vill beräkna ranger separat inom varje grupp (till exempel lönerang inom varje avdelning) kombinerar ni groupby() med rank(). Använd groupby().rank(), som tillämpar rangfunktionen grupp för grupp och returnerar en Series som är justerad efter det ursprungliga DataFrame-indexet — perfekt för att lägga till en kolumn med rang inom gruppen.
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() för intervall med samma bredd
pd.cut(series, bins) delar en kontinuerlig numerisk kolumn i intervall med samma bredd (bins) och tilldelar varje värde ett intervall. Detta omvandlar en kontinuerlig variabel till en kategorisk variabel och är användbart för histogram, åldersgrupper, inkomstintervall och andra diskretiseringsuppgifter. Resultatet är en kategorisk Series med intervall som etiketter.
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() för intervall med samma frekvens
pd.qcut(series, q) delar värdena i kvantilbaserade intervall där varje intervall innehåller ungefär lika många observationer. Till skillnad från pd.cut() (samma bredd) skapar pd.qcut() grupper av samma storlek — användbart för percentilbaserad segmentering, till exempel decilpoäng, kvintilindelning eller kvartilgruppering.
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() jämfört med qcut() — viktiga skillnader
Använd pd.cut() när intervallen har en naturlig innebörd i domänen (till exempel åldersintervallen 0–18, 18–35, 35–60) — intervallens bredd har då en semantisk betydelse. Använd pd.qcut() när ni vill ha grupper av samma storlek, oavsett var gränserna hamnar — till exempel för att dela in kunder i de översta respektive nedersta kvartilerna. En skev fördelning ger mycket ojämna grupper med cut(), men grupper av samma storlek med qcut().
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)Lägga till rangnumret som en kolumn
Ett tydligt mönster för att skapa en rangordnad resultattabell är att sortera fallande, återställa indexet till ett nollbaserat index, öka med 1 för en människoläsbar rangordning som börjar på 1 och visa resultatet bredvid originaldata. Detta ger en presentationsklar topplista utan luckor och med tydliga rangnummer.
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 som en egenskap för maskininlärning
Rangomvandlade egenskaper är användbara inom maskininlärning eftersom de är robusta mot avvikande värden — ett mycket stort eller mycket litet värde får en rang nära en ytterlighet i stället för att snedvrida egenskapens fördelning. Rangomvandling används ibland som ett förbehandlingssteg före träd-baserade modeller eller när den numeriska skalan saknar betydelse men den relativa ordningen är relevant.
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 disproportionateSnabbtest
Testa er förståelse av rangordning av värden i Pandas.
Lektionssammanfattning
I den här lektionen har ni lärt er att rank() tilldelar ordningspositioner till värden, att method='dense' undviker luckor efter lika värden, att pct=True ger percentilranger i [0,1] och att groupby().rank() beräknar ranger inom grupper. Använd pd.cut() för intervall med samma bredd och pd.qcut() för intervall med samma frekvens när ni diskretiserar kontinuerliga variabler. Nästa steg är att ange och återställa DataFrame-indexet.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Rangordna värden” gratis?
Ja – hela texten till ”Rangordna värden” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Pandas & NumPy Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Rangordna värden”?
Tilldela rang till kolumnvärden med rank(), välj metoder för att hantera lika värden och skapa percentilintervall med pd.cut(). Ni övar på Pandas & NumPy Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Pandas & NumPy Academy?
Du behöver inga förkunskaper. Utbildningen i Pandas & NumPy Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Rangordna värden”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Pandas & NumPy Academy-lektionen?
Ja. Varje Pandas & NumPy Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.