Función pd.cut() de Pandas
pd.cut()Es una función de la biblioteca Pandas que se utiliza paradiscretizar datos continuos (Binning)la cual divide los datos numéricos en categorías discretas según los intervalos especificados, muy adecuada para estadísticas de grupo y visualización en el análisis de datos.
La operación de discretización (binning) es muy común en el análisis de datos, por ejemplo, dividir la edad en «joven», «mediana edad», «anciano», o dividir las calificaciones en «reprobado», «aprobado», «notable», «sobresaliente», etc.
Significado de la palabra: cutSignifica «cortar»; aquí se refiere a «cortar» un intervalo de datos continuos en múltiples intervalos discretos.
Sintaxis básica y parámetros
pd.cut()Es una función de nivel superior de la biblioteca Pandas, utilizada para discretizar variables continuas.
Formato de sintaxis
pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
Descripción de parámetros
- Parámetro:
x- Tipo: objeto similar a un arreglo (array-like), como listas, Series, arreglos, etc.
- Descripción: datos numéricos continuos que se van a discretizar (segmentar en intervalos).
- Parámetro:
bins- Tipo: entero, escalar (límites de intervalo) o IntervalIndex.
- Descripción: el método de discretización. Puede ser un entero (indica en cuántos contenedores de igual ancho dividir) o una lista (especifica los límites de los intervalos).
- Parámetro:
right- Tipo: valor booleano.
- Descripción: si se utiliza el intervalo cerrado a la derecha. El valor por defecto es
True(es decir, la forma [a, b]). Si se establece comoFalse, entonces es un intervalo cerrado a la izquierda y abierto a la derecha (a, b].
- Parámetro:
labels- Tipo: arreglo o None.
- Descripción: especifica etiquetas personalizadas para cada intervalo. Si no se especifica, se usa la representación del intervalo (por ejemplo, «(0, 10]»).
- Parámetro:
retbins- Tipo: valor booleano.
- Descripción: si es
True, el resultado incluye los valores límite de los contenedores. El valor por defecto esFalse。
- Parámetro:
include_lowest- Tipo: valor booleano.
- Descripción: si es
True, el primer intervalo incluye el límite izquierdo. El valor por defecto esFalse。
Descripción de la función
- Valor de retorno: Devuelve una Series de tipo Categorical, donde cada valor corresponde al intervalo al que pertenece.
- Efecto: Asigna valores numéricos continuos a categorías discretas (intervalos).
Ejemplos
Vamos a dominar completamente, mediante una serie de ejemplos de simples a complejos,pd.cut()el uso de esta función.
Ejemplo 1: Uso básico - contenedores de igual ancho
Ejemplo
import numpy as np
# 1. Crear datos numéricos
scores = pd.Series([55, 70, 82, 45, 90, 65, 78, 88, 92, 58])
print("=== Puntuaciones originales ===")
print(scores)
# 2. Dividir las puntuaciones en 3 intervalos de igual ancho
result = pd.cut(scores, bins=3)
print("\n=== pd.cut(scores, bins=3) contenedores de igual ancho ===")
print(result)
# 3. Ver los límites de los contenedores
result_bins = pd.cut(scores, bins=3, retbins=True)
print("\n=== Devolver límites de contenedores ===")
print(f"Límites de los contenedores: {result_bins)
Resultado esperado:
=== 原始分数 === 0 55 1 70 2 82 3 45 4 90 5 65 6 78 7 88 8 92 9 58 === pd.cut(scores, bins=3) 等宽分箱 === 0 (44.667, 60.667] 1 (60.667, 76.333] 2 (76.333, 92.0] 3 (44.667, 60.667] 4 (76.333, 92.0] 5 (60.667, 76.333] 6 (60.667, 76.333] 7 (76.333, 92.0] 8 (76.333, 92.0] 9 (44.667, 60.667] dtype: category Categories (3, interval[float64]): [(44.667, 60.667] < (60.667, 76.333] < (76.333, 92.0] === 返回分箱边界 === 分箱边界: [44.667 60.667 76.333 92. ]
Explicación del código:
bins=3Indica que los datos se dividen automáticamente en 3 intervalos de igual ancho.- Pandas calcula automáticamente los límites de los intervalos según el valor mínimo y máximo de los datos.
- El resultado es de tipo Categorical, cada valor es un objeto Interval (intervalo).
- Por defecto se usa el intervalo cerrado a la derecha, es decir, la forma (a, b].
Ejemplo 2: Límites de intervalo personalizados
En la práctica, a menudo necesitamos personalizar los límites de los intervalos según los requisitos del negocio.
Ejemplo
import numpy as np
# Crear datos de calificaciones
scores = pd.Series([55, 70, 82, 45, 90, 65, 78, 88, 92, 58, 73, 67, 81, 49, 95])
# Personalizar los límites de los contenedores: reprobado, aprobado, notable, sobresaliente
bins = [0, 60, 75, 90, 100]
labels = ['Reprobado', 'Aprobado', 'Notable', 'Sobresaliente']
result = pd.cut(scores, bins=bins, labels=labels, include_lowest=True)
print("=== Calificaciones originales ===")
print(scores.values)
print("\n=== Resultado del binning ===)
print(result)
# Contar el número de personas en cada nivel
print("\n=== Estadísticas de distribución de calificaciones ===)
print(result.value_counts().sort_index())
Resultado esperado:
=== 原始成绩 [55 70 82 45 90 65 78 88 92 58 73 67 81 49 95] === 分箱结果 0 及格 1 良好 2 良好 3 不及格 4 优秀 ... 12 良好 13 不及格 14 优秀 dtype: category Categories (4, interval[int64]): [不及格 < 及格 < 良好 < 优秀] === 成绩分布统计 不及格 3 及格 4 良好 5 优秀 3 dtype: int64
Explicación del código:
bins=[0, 60, 75, 90, 100]Define 4 intervalos: [0-60], (60-75], (75-90], (90-100]labelsEl parámetro asigna etiquetas chinas intuitivas a cada intervalo.include_lowest=TrueAsegura que el primer intervalo incluya el límite izquierdo 0.value_counts()Permite contar fácilmente el número de personas en cada nivel.
Ejemplo 3: Uso de intervalos cerrados a la derecha/izquierda
Ejemplo
import numpy as np
# Datos de prueba
data = pd.Series([10, 20, 30, 40, 50])
# Intervalo cerrado a la derecha por defecto [a, b]
result1 = pd.cut(data, bins=4)
print("=== Intervalo cerrado a la derecha por defecto [a, b] ===")
print(result1)
# Intervalo cerrado a la izquierda y abierto a la derecha (a, b]
result2 = pd.cut(data, bins=4, right=False)
print("\n=== Intervalo cerrado a la izquierda y abierto a la derecha (a, b] ===)
print(result2)
Resultado esperado:
=== 默认右闭区间 [a, b] 0 (7.5, 17.5] 1 (17.5, 27.5] 2 (27.5, 37.5] 3 (37.5, 47.5] 4 (47.5, 57.5] dtype: category === 左闭右开区间 (a, b] 0 [10, 17.5) 1 [17.5, 27.5) 2 [27.5, 37.5) 3 [37.5, 47.5) 4 [47.5, 57.5) dtype: category
Explicación del código:
- Por defecto se usa el intervalo cerrado a la derecha
[a, b], es decir, incluye el límite derecho - Al configurar
right=Falsese cambia a un intervalo cerrado a la izquierda y abierto a la derecha.[a, b) - El modo de apertura/cierre de los intervalos afecta la clasificación de los valores límite.
Notas importantes
Aviso importante:
- Si hay valores en los datos que exceden
binsel rango especificado, se generaráNaNbinslos límites deben ser monótonamente crecientes.- Al usar etiquetas personalizadas, el número de etiquetas debe ser uno menos que el número de límites.
- El resultado después del binning es de tipo Categorical y se puede procesar con métodos de cadena.
Otras extensiones
Funciones comunes de Pandas