0Pricing
Pandas & NumPy Academy · Lección

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

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

Mé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           3

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

Clasificació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          2

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

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

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

Comprobació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

  1. Ordenar por valores de columna
  2. Ordenar por índice
  3. Asignar rangos a los valores
  4. Establecer y restablecer el índice
← Volver a Pandas & NumPy Academy