Asignar rangos a los valores
Asigne rangos a los valores de una columna con rank(), elija métodos para resolver empates y cree intervalos de percentiles con pd.cut().
Asignar rangos a los valores es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué es la clasificación?
La clasificación asigna a cada valor de una Series una posición según su magnitud relativa: el rango 1 corresponde al valor más pequeño y el rango n al más grande (o al contrario). A diferencia de la ordenación, que reordena las filas, rank() añade una nueva columna de posiciones ordinales junto a los datos originales. Las clasificaciones se utilizan en tablas de posiciones, en el cálculo de percentiles y en determinadas pruebas estadísticas que requieren una posición ordinal en lugar de valores absolutos.
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.0Clasificación ascendente y descendente
De forma predeterminada, rank() asigna el rango 1 al valor más pequeño (orden ascendente). Para asignar el rango 1 al valor más grande (por ejemplo, el primer puesto en una competición), pase ascending=False. Esto refleja la convención de que «el primer puesto corresponde a la puntuación más alta», utilizada en deportes, tablas de posiciones y clasificaciones de ventas.
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étodos para resolver empates
Cuando varias filas tienen el mismo valor (un empate), el parámetro method determina cómo se asignan los rangos. Las opciones son: 'average' (predeterminada: las filas empatadas comparten el rango promedio), 'min' (todas las filas empatadas reciben el rango más bajo), 'max' (todas reciben el más alto), 'first' (la fila que aparece primero recibe el rango más bajo) y 'dense' (no hay saltos en los números de rango después de un empate).
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]Clasificación densa: sin saltos después de los empates
El método 'dense' resulta especialmente útil cuando desea una clasificación sin saltos. Con 'min', dos entradas empatadas en el 2.º puesto hacen que el siguiente rango sea el 4 (se omite el 3). Con 'dense', el siguiente rango siempre es el 3, lo que mantiene una secuencia continua. La clasificación densa es el método estándar de la función de ventana DENSE_RANK() de SQL y se utiliza habitualmente en tablas de posiciones.
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 3Clasificación por percentiles con pct=True
Establecer pct=True en rank() normaliza los rangos al intervalo [0, 1] y proporciona una clasificación percentil. Un valor con una clasificación percentil de 0.8 indica que es superior al 80 % de los valores de la columna. Esto se utiliza en finanzas (rendimiento percentil), evaluación de calificaciones (percentiles de puntuación) y detección de valores atípicos.
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.0Clasificación dentro de grupos
Para calcular rangos dentro de cada grupo de forma independiente (por ejemplo, el rango salarial de cada departamento), combine groupby() con rank(). Utilice groupby().rank(), que aplica la función de clasificación grupo por grupo y devuelve una Series alineada con el índice del DataFrame original, perfecta para añadir una columna de «rango dentro del grupo».
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() para intervalos de igual amplitud
pd.cut(series, bins) divide una columna numérica continua en intervalos de igual amplitud (bins) y asigna cada valor a su intervalo. Esto convierte una variable continua en una categórica, lo que resulta útil para histogramas, grupos de edad, tramos de ingresos o cualquier tarea de discretización. El resultado es una Series categórica con etiquetas de intervalo.
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() para intervalos de igual frecuencia
pd.qcut(series, q) divide los valores en intervalos basados en cuantiles, de modo que cada intervalo contiene aproximadamente el mismo número de observaciones. A diferencia de pd.cut() (igual amplitud), pd.qcut() produce grupos del mismo tamaño, lo que resulta útil para segmentaciones basadas en percentiles, como puntuaciones por deciles, divisiones por quintiles o agrupaciones por cuartiles.
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() frente a qcut(): diferencias clave
Utilice pd.cut() cuando sus intervalos tengan un significado natural en el dominio (por ejemplo, grupos de edad de 0-18, 18-35 y 35-60): la amplitud de los intervalos tiene importancia semántica. Utilice pd.qcut() cuando desee grupos del mismo tamaño, independientemente de dónde queden los límites; por ejemplo, para dividir a los clientes en cuartiles superior e inferior. Una distribución sesgada producirá grupos muy desiguales con cut(), pero grupos iguales 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)Añadir el número de rango como columna
Un patrón claro para generar una tabla de resultados clasificados es: ordenar de forma descendente, restablecer el índice empezando en 0, sumar 1 para obtener una clasificación legible para las personas y mostrarla junto a los datos originales. Así se obtiene una tabla de posiciones lista para presentar, sin saltos y con números de rango claros.
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)El rango como característica para aprendizaje automático
Las características transformadas mediante rangos son útiles en el aprendizaje automático porque son resistentes a los valores atípicos: un valor muy grande o muy pequeño recibe un rango cercano a uno de los extremos, en lugar de sesgar la distribución de la característica. La transformación por rangos se utiliza a veces como paso de preprocesamiento antes de modelos basados en árboles o cuando la escala numérica no es significativa, pero sí lo es el orden 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 disproportionateComprobación rápida
Compruebe su comprensión de la clasificación de valores en Pandas.
Recapitulación de la lección
En esta lección ha aprendido que rank() asigna posiciones ordinales a los valores, que method='dense' evita los saltos después de los empates, que pct=True proporciona rangos percentiles en [0,1] y que groupby().rank() calcula rangos dentro de cada grupo. Utilice pd.cut() para intervalos de igual amplitud y pd.qcut() para intervalos de igual frecuencia al discretizar variables continuas. A continuación, estableceremos y restableceremos el índice del DataFrame.
Preguntas frecuentes
¿La lección «Asignar rangos a los valores» es gratis?
Sí — el texto completo de «Asignar rangos a los valores» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Asignar rangos a los valores»?
Asigne rangos a los valores de una columna con rank(), elija métodos para resolver empates y cree intervalos de percentiles con pd.cut(). Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Pandas & NumPy Academy?
No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Asignar rangos a los valores»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?
Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Ordenar por valores de columna
- Ordenar por índice
- Asignar rangos a los valores
- Establecer y restablecer el índice