Classer les valeurs
Attribuez des rangs aux valeurs d’une colonne avec rank(), choisissez les méthodes de résolution des ex æquo et créez des intervalles de percentiles avec pd.cut().
Classer les valeurs est une leçon Pandas & NumPy Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Pandas & NumPy Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Pandas & NumPy Academy comprend 4 leçons au total.
Qu’est-ce que le classement ?
Le classement attribue à chaque valeur d’une Series une position selon son importance relative : le rang 1 pour la plus petite valeur, le rang n pour la plus grande (ou l’inverse). Contrairement au tri, qui réorganise les lignes, rank() ajoute une nouvelle colonne de positions ordinales à côté des données d’origine. Les classements sont utilisés dans les tableaux de résultats, le calcul des percentiles et certains tests statistiques qui nécessitent une position ordinale plutôt que des valeurs absolues.
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.0Classement croissant ou décroissant
Par défaut, rank() attribue le rang 1 à la valeur la plus petite (ordre croissant). Pour attribuer le rang 1 à la plus grande valeur (par exemple, la première place d’une compétition), transmettez ascending=False. Cette convention correspond à celle de la « première place = score le plus élevé », utilisée dans le sport, les tableaux de résultats et les classements des ventes.
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.0Méthodes de départage des égalités
Lorsque plusieurs lignes possèdent la même valeur (une égalité), le paramètre method détermine l’attribution des rangs. Les options sont : 'average' (par défaut : les lignes à égalité partagent le rang moyen), 'min' (toutes reçoivent le rang le plus bas), 'max' (toutes reçoivent le rang le plus élevé), 'first' (la ligne apparaissant en premier reçoit le rang le plus bas) et 'dense' (aucun numéro de rang n’est omis après une égalité).
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]Classement dense : aucun saut après les égalités
La méthode 'dense' est particulièrement utile lorsque vous souhaitez un classement sans saut. Avec 'min', deux entrées à égalité à la 2e place font passer le rang suivant à 4 (le rang 3 est omis). Avec 'dense', le rang suivant est toujours 3, ce qui préserve une suite continue. Le classement dense est la norme dans la fonction de fenêtre SQL DENSE_RANK() et est couramment utilisé dans les tableaux de résultats.
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 3Classement en percentile avec pct=True
La définition de pct=True dans rank() normalise les rangs dans l’intervalle [0, 1], ce qui fournit un rang en percentile. Une valeur dont le rang en percentile est 0.8 est supérieure à 80 % des valeurs de la colonne. Cette méthode est utilisée en finance (performances en percentile), dans l’évaluation (percentiles des notes) et pour détecter les valeurs aberrantes.
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.0Classement au sein de groupes
Pour calculer les rangs indépendamment dans chaque groupe (par exemple, le rang de salaire dans chaque service), combinez groupby() et rank(). Utilisez groupby().rank() : la fonction de classement est appliquée groupe par groupe et renvoie une Series alignée sur l’index du DataFrame d’origine, ce qui est idéal pour ajouter une colonne de « rang dans le groupe ».
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() pour des intervalles de même largeur
pd.cut(series, bins) divise une colonne numérique continue en intervalles de même largeur (classes) et attribue chaque valeur à sa classe. Cela transforme une variable continue en variable catégorielle, ce qui est utile pour les histogrammes, les tranches d’âge, les catégories de revenus ou toute tâche de discrétisation. Le résultat est une Series catégorielle avec des étiquettes d’intervalle.
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() pour des classes de même fréquence
pd.qcut(series, q) divise les valeurs en classes fondées sur les quantiles, chaque classe contenant approximativement le même nombre d’observations. Contrairement à pd.cut() (largeur identique), pd.qcut() produit des groupes de même taille, ce qui est utile pour une segmentation fondée sur les percentiles, comme les déciles, les quintiles ou les quartiles.
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() ou qcut() : principales différences
Utilisez pd.cut() lorsque vos classes ont une signification naturelle dans le domaine (par exemple, les tranches d’âge 0-18, 18-35, 35-60) : la largeur des classes a alors une importance sémantique. Utilisez pd.qcut() lorsque vous souhaitez des groupes de même taille, quelles que soient les limites obtenues, par exemple pour répartir les clients dans les quartiles supérieur et inférieur. Une distribution asymétrique produit des groupes très inégaux avec cut(), mais des groupes de même taille avec 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)Ajouter le numéro de rang comme colonne
Pour produire un tableau de résultats classés, une méthode claire consiste à trier par ordre décroissant, à réinitialiser l’index à partir de 0, à ajouter 1 pour obtenir un classement lisible par les personnes, puis à afficher le résultat à côté des données d’origine. Vous obtenez ainsi un tableau de résultats prêt à être présenté, sans rangs manquants et avec des numéros de rang propres.
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)Le rang comme caractéristique pour l’apprentissage automatique
Les caractéristiques transformées en rangs sont utiles en apprentissage automatique, car elles sont robustes aux valeurs aberrantes : une valeur très grande ou très petite reçoit un rang proche d’une extrémité au lieu de fausser la distribution de la caractéristique. La transformation en rangs est parfois utilisée comme étape de prétraitement avant des modèles fondés sur des arbres, ou lorsque l’échelle numérique n’a pas de signification mais que l’ordre relatif en a une.
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 disproportionateVérification rapide
Vérifiez votre compréhension du classement des valeurs dans Pandas.
Récapitulatif de la leçon
Dans cette leçon, vous avez appris que rank() attribue des positions ordinales aux valeurs, que method='dense' évite les rangs manquants après les égalités, que pct=True fournit des rangs en percentile dans [0,1] et que groupby().rank() calcule les rangs au sein de chaque groupe. Utilisez pd.cut() pour des classes de même largeur et pd.qcut() pour des classes de même fréquence lors de la discrétisation de variables continues. Ensuite, nous définirons et réinitialiserons l’index du DataFrame.
Apprends Python avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 30
- Leçons
- 120
Questions Fréquemment Posées
La leçon « Classer les valeurs » est-elle gratuite ?
Oui — le texte complet de « Classer les valeurs » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Pandas & NumPy Academy, passe à CoddyKit PRO. Le cours Pandas & NumPy Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Classer les valeurs » ?
Attribuez des rangs aux valeurs d’une colonne avec rank(), choisissez les méthodes de résolution des ex æquo et créez des intervalles de percentiles avec pd.cut(). Tu pratiques Pandas & NumPy Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Pandas & NumPy Academy ?
Aucune expérience préalable n'est requise. Pandas & NumPy Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Classer les valeurs » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Pandas & NumPy Academy ?
Oui. Chaque leçon Pandas & NumPy Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Trier par valeurs de colonne
- Trier par index
- Classer les valeurs
- Définir et réinitialiser l’index