API · Pandas

Pandas Función cut

Este tutorial explica cómo distribuir datos en rangos, también llamados bins, con la función pandas.cut().

En esta página

La función pandas.cut() asigna valores numéricos a rangos, también llamados bins. Devuelve una categoría de intervalo por cada valor de entrada, por lo que resulta útil para convertir mediciones continuas, como edades o puntuaciones, en grupos para su análisis. Puedes indicar puntos de corte explícitos o pedir a pandas que divida un rango en una cantidad determinada de bins.

Sintaxis, parámetros y valor devuelto

La llamada a la función es pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates="raise", ordered=True).

Estos son los argumentos que se usan con más frecuencia:

Parámetro Descripción
x Valores numéricos similares a un array que se van a asignar, como una lista, una Series o una columna de un DataFrame.
bins Un número entero de bins de igual anchura, una secuencia de puntos de corte explícitos o un IntervalIndex. Si es un entero, pandas obtiene el rango a partir de los valores mínimo y máximo de x, lo divide en esa cantidad de bins de igual anchura y amplía el rango un 0.1% por cada extremo para incluir ambos valores límite. Una secuencia proporciona directamente los puntos de corte y no aplica este ajuste del rango para bins enteros.
right Cuando es True (el valor predeterminado), los intervalos incluyen su extremo derecho. Establécelo en False para usar intervalos cerrados por la izquierda.
labels Etiquetas opcionales, una por cada bin. Usa False para devolver las posiciones de los bins como enteros.
retbins Cuando es True, también devuelve los puntos de corte usados para formar los bins.
precision Precisión que se usa al almacenar y mostrar los puntos de corte.
include_lowest Cuando es True, incluye el punto de corte más bajo en el primer intervalo.
duplicates Elige "raise" (el valor predeterminado) o "drop" si los puntos de corte contienen valores duplicados.
ordered Indica si las categorías resultantes están ordenadas; su valor predeterminado es True.

Normalmente, el resultado contiene un valor categórico por cada elemento de x. Los valores que quedan fuera de todos los intervalos se representan como NaN. Con retbins=True, la función devuelve una pareja: el resultado para cada valor y el array de puntos de corte.

Asignar valores de un DataFrame a bins

Pasa una columna del DataFrame como x, indica los puntos de corte de los intervalos mediante bins y asigna la Series devuelta a una columna nueva. Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["Anish", "Birat", "Chirag", "Kabin", "Sachin"],
        "Age": [23, 34, 38, 45, 27],
        "Score": [316, 322, 332, 330, 325],
    }
)

df["Age-Range"] = pd.cut(df["Age"], bins=[20, 30, 40, 50])
print(df[["Age", "Age-Range"]].to_string(index=False))

Hay tres bins porque cuatro puntos de corte definen tres intervalos. Cada fila conserva su posición original, y el valor de Age-Range indica el intervalo que contiene la edad de esa fila. Por ejemplo, la edad 23 corresponde a (20, 30], mientras que la edad 45 corresponde a (40, 50] con la convención de intervalos predeterminada.

Controlar los límites de los intervalos

De forma predeterminada, right=True crea intervalos cerrados por la derecha. La notación (20, 30] representa los valores mayores que 20 y menores o iguales que 30: se excluye 20 y se incluye 30. include_lowest=True también incluye el punto de corte más bajo en el primer intervalo. Establece right=False para usar intervalos cerrados por la izquierda y abiertos por la derecha, como [20, 30), que incluyen 20 y excluyen 30. Con esa opción, el punto de corte más alto queda fuera del último intervalo. Los valores que no coinciden con ningún intervalo se devuelven como NaN.

El siguiente ejemplo compara esas opciones para edades que coinciden con los puntos de corte y para edades que quedan entre ellos:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import pandas as pd

ages = pd.Series([20, 23, 30, 45, 50], name="Age")
result = pd.DataFrame(
    {
        "Age": ages,
        "default": pd.cut(ages, bins=[20, 30, 40, 50]),
        "include_lowest": pd.cut(
            ages, bins=[20, 30, 40, 50], include_lowest=True
        ),
        "left_closed": pd.cut(
            ages, bins=[20, 30, 40, 50], right=False
        ),
    }
)
print(result.to_string(index=False))

Compara las filas correspondientes a 20 y 50 para ver cómo las opciones de los extremos afectan a la pertenencia a los intervalos. El valor predeterminado incluye 50 en el último intervalo, pero excluye 20 del primero; include_lowest=True añade 20 al primer intervalo, mientras que right=False incluye 20 y deja 50 fuera del último intervalo.

Asignar etiquetas a los bins

Para mostrar nombres de categoría legibles en lugar de la notación de intervalos, pasa una etiqueta por cada bin. Las etiquetas siguen el orden de los intervalos, así que tres bins requieren tres etiquetas:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import pandas as pd

ages = pd.Series([23, 34, 38, 45, 27], name="Age")
labels = ["21 to 30", "31 to 40", "41 to 50"]
age_groups = pd.cut(
    ages,
    bins=[20, 30, 40, 50],
    labels=labels,
)
print(age_groups.to_string(index=False))

Con los valores predeterminados, la primera etiqueta corresponde a (20, 30], la segunda a (30, 40] y la tercera a (40, 50]. Si necesitas las posiciones numéricas de los grupos en lugar de nombres, pasa labels=False; pandas devolverá códigos enteros de bin para los valores asignados a un bin.

Devolver los límites de los bins con retbins=True

Establece retbins=True si necesitas tanto las categorías de cada valor como los puntos de corte usados para crearlas. El primer elemento devuelto corresponde a x; el segundo es el array compartido de límites de los bins. En este ejemplo se desempaquetan ambos:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import pandas as pd

ages = pd.Series([23, 34, 38, 45, 27], name="Age")
age_groups, bin_edges = pd.cut(
    ages,
    bins=[20, 30, 40, 50],
    labels=["21 to 30", "31 to 40", "41 to 50"],
    retbins=True,
)
print("Groups:")
print(age_groups.to_string(index=False))
print("Bin edges:")
print(bin_edges)

age_groups contiene un resultado etiquetado por cada edad, mientras que bin_edges contiene [20, 30, 40, 50]. El mismo patrón resulta útil cuando bins es un entero y pandas calcula puntos de corte equidistantes: conserva los límites devueltos si necesitas consultarlos o reutilizarlos.