Función Pandas pd.qcut()

Pandas 通用函数Funciones comunes de Pandas


pd.qcut()Es una función de la biblioteca Pandas utilizada paraagrupar por cuantilesDivide los datos en un número igual de muestras, y cada contenedor contiene aproximadamente la misma cantidad de puntos de datos.

ypd.cut()A diferencia de la agrupación de ancho fijo,pd.qcut()asegura que la cantidad de datos dentro de cada intervalo sea igual, lo que es muy adecuado para manejar datos con distribución asimétrica o para los casos en que se necesita dividir según los cuantiles naturales de los datos.

Significado de las palabras: qcutEn "q" significa "quantile" (cuantil), es decir, "cortar" los datos según los cuantiles.


Sintaxis básica y parámetros

pd.qcut()Es una función de nivel superior de la biblioteca Pandas, utilizada para discretizar según los cuantiles.

Formato de sintaxis

pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')

Descripción de parámetros

  • Parámetro: x
    • Tipo: objeto similar a un array, como listas, Series, arrays, etc.
    • Descripción: datos numéricos continuos que se van a agrupar.
  • Parámetro: q
    • Tipo: entero o array de cuantiles.
    • Descripción: número de contenedores o cuantiles específicos. Si es un entero n, indica dividir los datos en n grupos de igual tamaño (cada grupo contiene aproximadamente n/1 de los datos). También puede ser un array de cuantiles (como [0, 0.25, 0.5, 0.75, 1.0]).
  • Parámetro: labels
    • Tipo: array o None.
    • Descripción: especificar etiquetas personalizadas para cada intervalo. Si no se especifica, se usa la representación de cuantiles (como "(0, 25]").
  • Parámetro: retbins
    • Tipo: valor booleano.
    • Descripción: si esTrue, el resultado devuelto incluye los valores límite de los contenedores. Valor predeterminado:False。
  • Parámetro: duplicates
    • Tipo: cadena ('raise' o 'drop').
    • Descripción: si los límites de los contenedores están duplicados (lo que hace que el número de intervalos sea menor que el valor q especificado),'raise'lanzará una excepción,'drop'eliminará los límites duplicados. Valor predeterminado:'raise'。

Descripción de la función

  • Valor de retorno: devuelve una Series de tipo Categorical, donde cada valor corresponde a su grupo de cuantiles.Efecto: mapea valores numéricos continuos a categorías discretas según los cuantiles, donde cada categoría contiene aproximadamente la misma cantidad de muestras.
  • Efecto: mapea valores numéricos continuos a categorías discretas según los cuantiles, cada categoría contiene aproximadamente la misma cantidad de muestras.

Ejemplos

A través de una serie de ejemplos, de simples a complejos, dominaremos completamente el uso depd.qcut().

Ejemplo 1: Uso básico: agrupación por cuartiles

Ejemplo

import pandas as pd
import numpy as np

# 1. Crear datos numéricos sesgados (la mayoría de los valores son pequeños)
np.random.seed(42)
data = np.random.exponential(scale=2, size=100)  # datos de distribución exponencial

# para mayor legibilidad, tomar parte de los datos
scores = pd.Series(data[:20])

print("=== Datos originales ===")
print(scores.sort_values().values)

# 2. Usar pd.qcut() para dividir los datos en 4 grupos de cuartiles
result = pd.qcut(scores, q=4)
print("\n=== pd.qcut(scores, q=4) Agrupación por cuartiles ===")
print(result.value_counts().sort_index())

Resultado esperado:

=== 原始数据 ===
[ 0.078  0.29   0.68   0.91   1.03  1.06  1.23  1.3   1.5   1.69
  1.86  2.01  2.12  2.3   2.32  2.42  3.03  3.39  5.29  7.39]

=== pd.qcut(scores, q=4) 四分位分箱 ===
(0.0783, 1.547]     5
(1.547, 2.315]     5
(2.315, 3.151]     5
(3.151, 7.393]     5
dtype: int64

Análisis del código:

  1. Para datos de distribución exponencial, si se usa agrupación de ancho fijo, la mayoría de los datos se concentrarían en un solo contenedor.
  2. pd.qcut()Asegura que cada contenedor tenga aproximadamente la misma cantidad de muestras (aquí son 5, exactamente 20/4).
  3. Los puntos de corte se calculan según la distribución real de los datos, no se dividen uniformemente.

Ejemplo 2: Especificar cuantiles personalizados

Se pueden especificar cuantiles arbitrarios mediante el parámetroq, como deciles, percentiles, etc.

Ejemplo

import pandas as pd
import numpy as np

# 1. Crear datos
df = pd.DataFrame({
    'name': ['Student_' + str(i) for i in range(1, 11)],
    'score': [65, 78, 82, 55, 90, 72, 68, 85, 45, 95]
})

print("=== Datos de calificaciones de estudiantes ===")
print(df)

# 2. Agrupar según cuantiles personalizados [0, 0.3, 0.7, 1.0] que representan 30%, 70%, 100%
result = pd.qcut(df['score'], q=[0, 0.3, 0.7, 1.0])
print("\n=== Agrupación por cuantiles al 30% y 70% ===")
print(result)

# 3. Agregar etiquetas personalizadas
labels = ['aprobado', 'bien', 'excelente']
result_labeled = pd.qcut(df['score'], q=3, labels=labels)
print("\n=== Etiquetas personalizadas agregadas ===")
print(result_labeled)

Resultado esperado:

=== 学生成绩数据 ===
      name  score
0  Student_1     65
1  Student_2     78
2  Student_3     82
3  Student_4     55
4  Student_5     90
5  Student_6     72
6  Student_7     68
7  Student_8     85
8  Student_9     45
9  Student_10    95

=== 按 30% 和 70% 分位数分箱 ===
0      (44.999, 65.8]
1      (65.8, 86.4]
2      (65.8, 86.4]
3      (44.999, 65.8]
4      (86.4, 95.0]
5      (65.8, 86. 86.4]
6      (0.0, 44.999]
7      (44.999, 65.8]
8      (0.0, 44.999]
9      (65.8, 86.4]
10     (65.8, 86.4]

Análisis del código:

  • q=[0, 0.3, 0.7, 1.0]Se definen tres intervalos: 0-30% (puntaje bajo), 30%-70% (medio), 70%-100% (alto).
  • Usando el parámetrolabelsse puede nombrar cada intervalo en lugar de la representación predeterminada.

Ejemplo 3: Comparación entre cut y qcut

Mediante la comparación se puede entender más claramente la diferencia entrecutyqcut.

Ejemplo

import pandas as pd
import numpy as np

# 1. Crear datos sesgados (la mayoría de los valores son pequeños)
data = pd.Series([1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 20, 30, 40, 50])

print("=== Datos originales ===")
print(data.values)

# 2. Agrupación de ancho fijo (pd.cut)
print("\n=== pd.cut agrupación de ancho fijo ===")
cut_result = pd.cut(data, bins=4)
print(cut_result.value_counts().sort_index())

# 3. Agrupación de igual cantidad (pd.qcut)
print("\n=== pd.qcut agrupación de igual cantidad ===")
qcut_result = pd.qcut(data, q=4)
print(qcut_result.value_counts().sort_index())

Resultado esperado:

=== 原始数据 ===
[ 1  1  1  1  1  1  1  1  1 10 20 30 40 50]

=== pd.cut 等宽分箱 ===
(0.975, 13.25]    10   # 10 个值在这个区间
(13.25, 25.5]      1
(25.5, 37.75]      1
(37.75, 50.0]      2   # 2 个值在这个区间
dtype: 50

=== pd.qcut 等量分箱 ===
(0.999, 7.75]      4   # 约 1/4 的数据
(7.75, 25.0]       4
(25.0, 42.5]       4
(10.0, 50.0]       4   # 约 1/4 的数据

Análisis del código:

  • pd.cut()Divide el rango de datos en 4 partes iguales, pero debido a que los datos están altamente sesgados, la mayoría de los valores (9 unos) caen en el primer intervalo.
  • pd.qcut()Asegura que cada intervalo contenga la misma cantidad de puntos de datos (4), aunque la amplitud de los intervalos varíe mucho.

Consejo: pd.cut()Es adecuado para datos con distribución uniforme o cuando se necesitan intervalos de ancho fijo.pd.qcut()Es adecuado para datos con distribución desigual o cuando se necesita dividir por rango/porcentaje.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones