Assegnare ranghi ai valori
Assegni i ranghi ai valori di una colonna con rank(), scelga i metodi per gestire i pari merito e crei intervalli percentile con pd.cut().
Assegnare ranghi ai valori è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Che cos'è il ranking?
Il ranking assegna a ogni valore di una Series una posizione in base alla sua grandezza relativa: il rango 1 al valore più piccolo e il rango n a quello più grande (o viceversa). A differenza dell'ordinamento, che riordina le righe, rank() aggiunge una nuova colonna di posizioni ordinali accanto ai dati originali. I ranking vengono utilizzati nelle classifiche, nel calcolo dei percentili e in alcuni test statistici che richiedono una posizione ordinale anziché valori assoluti.
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.0Ranking crescente e decrescente
Per impostazione predefinita, rank() assegna il rango 1 al valore più piccolo (ordinamento crescente). Per assegnare il rango 1 al valore più grande (ad esempio, il primo posto in una gara), passi ascending=False. Questo rispecchia la convenzione «primo posto = punteggio più alto» usata nello sport, nelle classifiche e nelle graduatorie di vendita.
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.0Metodi per risolvere i pari merito
Quando più righe hanno lo stesso valore (un pari merito), il parametro method determina come vengono assegnati i ranghi. Le opzioni sono: 'average' (predefinita: le righe a pari merito condividono il rango medio), 'min' (tutte ricevono il rango più basso), 'max' (tutte ricevono il più alto), 'first' (la riga che compare per prima riceve il rango più basso) e 'dense' (non ci sono interruzioni nei numeri dei ranghi dopo un pari merito).
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]Ranking denso: nessuna interruzione dopo i pari merito
Il metodo 'dense' è particolarmente utile quando si desidera una classifica senza interruzioni. Con 'min', due elementi a pari merito al 2° posto fanno sì che il rango successivo sia 4 (saltando il 3). Con 'dense', il rango successivo è sempre 3, mantenendo una sequenza continua. Il ranking denso è lo standard nella funzione finestra SQL DENSE_RANK() ed è comunemente usato nelle classifiche.
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 3Ranking percentile con pct=True
Impostando pct=True in rank() si normalizzano i ranghi nell'intervallo [0, 1], ottenendo un rango percentile. Un valore con rango percentile 0.8 è superiore all'80% dei valori nella colonna. Questa tecnica viene usata nella finanza (prestazioni percentile), nella valutazione (percentili dei punteggi) e nel rilevamento degli outlier.
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.0Ranking all'interno dei gruppi
Per calcolare i ranghi all'interno di ogni gruppo in modo indipendente (ad esempio, il rango dello stipendio in ciascun reparto), combini groupby() con rank(). Utilizzi groupby().rank(), che applica la funzione di ranking gruppo per gruppo e restituisce una Series allineata all'indice del DataFrame originale: è perfetta per aggiungere una colonna con il «rango all'interno del gruppo».
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() per intervalli di ampiezza uguale
pd.cut(series, bins) divide una colonna numerica continua in intervalli di ampiezza uguale (bin) e assegna ogni valore al relativo intervallo. In questo modo una variabile continua viene convertita in una variabile categorica, utile per istogrammi, fasce d'età, classi di reddito o qualsiasi attività di discretizzazione. Il risultato è una Series categorica con etichette degli intervalli.
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() per intervalli con frequenza uguale
pd.qcut(series, q) divide i valori in intervalli basati sui quantili, in modo che ogni intervallo contenga approssimativamente lo stesso numero di osservazioni. A differenza di pd.cut() (ampiezza uguale), pd.qcut() produce gruppi della stessa dimensione: è utile per segmentazioni basate sui percentili, come decili, quintili o quartili.
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() e qcut(): differenze principali
Utilizzi pd.cut() quando gli intervalli hanno un significato naturale nel dominio (ad esempio, fasce d'età 0-18, 18-35, 35-60): l'ampiezza degli intervalli ha un significato semantico. Utilizzi pd.qcut() quando desidera gruppi della stessa dimensione, indipendentemente dalla posizione dei confini, ad esempio per dividere i clienti nei quartili superiore e inferiore. Una distribuzione asimmetrica produce gruppi molto diversi con cut(), ma gruppi della stessa dimensione con 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)Aggiunta del numero di rango come colonna
Un metodo efficace per produrre una tabella ordinata per rango consiste nel: ordinare in senso decrescente, reimpostare l'indice a partire da 0, aggiungere 1 per ottenere una numerazione leggibile per le persone e visualizzare il risultato accanto ai dati originali. Si ottiene così una classifica pronta per la presentazione, senza interruzioni e con numeri di rango chiari.
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)Il rango come caratteristica per il machine learning
Le caratteristiche trasformate in ranghi sono utili nel machine learning perché sono robuste agli outlier: un valore molto grande o molto piccolo riceve un rango vicino agli estremi, invece di distorcere la distribuzione della caratteristica. La trasformazione in ranghi viene talvolta usata come fase di pre-elaborazione prima dei modelli basati su alberi o quando la scala numerica non è significativa, ma lo è l'ordine relativo.
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 disproportionateVerifica rapida
Verifichi la Sua comprensione del ranking dei valori in Pandas.
Riepilogo della lezione
In questa lezione ha imparato che: rank() assegna posizioni ordinali ai valori, method='dense' evita le interruzioni dopo i pari merito, pct=True fornisce ranghi percentili nell'intervallo [0,1] e groupby().rank() calcola i ranghi all'interno dei gruppi. Utilizzi pd.cut() per intervalli di ampiezza uguale e pd.qcut() per intervalli con frequenza uguale quando discretizza variabili continue. Nella prossima lezione imposteremo e reimposteremo l'indice del DataFrame.
Impara Python con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Assegnare ranghi ai valori» è gratuita?
Sì — il testo completo di «Assegnare ranghi ai valori» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «Assegnare ranghi ai valori»?
Assegni i ranghi ai valori di una colonna con rank(), scelga i metodi per gestire i pari merito e crei intervalli percentile con pd.cut(). Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Assegnare ranghi ai valori»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Ordinare in base ai valori delle colonne
- Ordinare in base all'indice
- Assegnare ranghi ai valori
- Impostare e reimpostare l'indice