Pandas groupby.agg() función

Funciones comunes de Pandas


groupby.agg()Es una de las funciones de agregación más potentes de Pandas, que permite aplicar simultáneamente múltiples funciones de agregación diferentes a los datos agrupados.

ysum()、mean()A diferencia de las funciones de agregación individuales,agg()puede calcular varios indicadores estadísticos de una sola vez, por ejemplo, calcular simultáneamente la suma, el promedio, el máximo, el mínimo de cada grupo, etc.

En el análisis de datos, a menudo es necesario realizar múltiples análisis estadísticos sobre los datos al mismo tiempo,agg()la función puede hacer que este proceso sea conciso y eficiente.


Sintaxis básica y parámetros

agg()Es una función miembro del objeto GroupBy; primero debe usargroupby()agrupar y luego llamarla.

Formato de sintaxis

GroupBy.agg(func=None, axis=0, *args, engine=None, engine_kwargs=None, **kwargs)

Descripción de parámetros

Parámetro Tipo Descripción Valor predeterminado
func str, list, dict o callable Función de agregación. Puede ser un solo nombre de función, una lista de funciones, o un diccionario que especifica diferentes funciones para cada columna. None
axis int La dirección del eje para aplicar la agregación; 0 indica por filas (dimensión de agrupación), 1 indica por columnas. 0
args tuple Parámetros posicionales adicionales que se pasan a la función de agregación. ()
engine str Especifica el motor de cálculo; puede ser 'cython' o 'numba'. None indica que Pandas lo elige automáticamente. None
engine_kwargs dict Diccionario de parámetros adicionales que se pasan al motor subyacente. None

Valor de retorno

  • Tipo de retorno:SeriesoDataFrame
  • Descripción: Devuelve el resultado de la agregación por grupos; la estructura del resultado depende del parámetro func y de la forma de agrupación.

Ejemplos

A través de una serie de ejemplos de simples a complejos, dominemos completamentegroupby.agg()el uso de la función.

Ejemplo 1: Uso de funciones de agregación integradas

La forma más sencilla es usar directamente los nombres de las funciones de agregación integradas de Pandas, como 'sum', 'mean', 'max', 'min', 'count', etc.

Ejemplo

import pandas as pd

# Crear un DataFrame de datos de ventas
data = {
    'Región': ['Norte de China', 'Este de China', 'Sur de China', 'Norte de China', 'Este de China', 'Sur de China', 'Norte de China', 'Este de China'],
    'Producto': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
    'Ventas': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
    'Cantidad': [10, 20, 15, 18, 22, 16, 12, 21]
}
df = pd.DataFrame(data)

print(Datos de ventas originales:)
print(df)
print()

# Agrupar por 'Región' y aplicar múltiples funciones de agregación a la columna 'Ventas'
# Usar una lista de cadenas para especificar múltiples funciones de agregación
result = df.groupby('Región')['Ventas'].agg(['sum', 'mean', 'max', 'min', 'count'])

print(Estadísticas resumidas de ventas por región:)
print(result)
print()

# Agregar también las columnas "Ventas" y "Cantidad"
result_all = df.groupby('Región').agg({
    'Ventas': ['sum', 'mean'],
    'Cantidad': ['sum', 'mean']
})

print(Estadísticas integrales de ventas y cantidades por región:)
print(result_all)

Resultado de la ejecución:

原始销售数据:
  地区  产品   销售额   数量
0  华北   A   1000    10
1  华东   B   2000    20
2  华南   C   1500    15
3  华北   B   1800    18
4  华东   A   2200    22
5  华南   C   1600    16
6  华北   A   1200    12
7  华东   B   2100    21

每个地区销售额的汇总统计:
        sum    mean   max   min  count
地区
华东  7100  1775.0  2200  2000      4
华南  3100  1550.0  1600  1500      2
华北  4000  1333.333333  1800  1000      3

各地区销售和数量的综合统计:
              销售额         数量
              sum    mean  sum   mean
地区
华东  7100  1775.0   83  20.75
华南  3100  1550.0   31  15.50
华北  4000  1333.333333   40  13.33

Análisis del código:

  1. ['sum', 'mean', 'max', 'min', 'count']Usando una lista se pueden especificar múltiples funciones de agregación a la vez.
  2. El resultado devuelto es un DataFrame; los nombres de las columnas se componen del nombre de la función y del nombre de la columna original (índice de columnas de varios niveles).
  3. Usando un diccionario se pueden especificar diferentes funciones de agregación para diferentes columnas.

Ejemplo 2: Uso de funciones de agregación personalizadas

Además de las funciones integradas,agg()también admite funciones personalizadas, lo que amplía enormemente su flexibilidad.

Ejemplo

import pandas as pd
import numpy as np

# Crear datos de calificaciones de estudiantes
data = {
    'Clase': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'A'],
    'Nombre': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', Sun Qi, Zhou Ba, Wu Jiu, Zheng Shi],
    Lengua china: [85, 92, 78, 88, 95, 82, 90, 87],
    Matemáticas: [90, 85, 92, 78, 88, 91, 85, 89]
}
df = pd.DataFrame(data)

print(Datos de calificaciones de estudiantes:)
print(df)
print()

# Define una función de agregación personalizada
def range_func(x):
    """Calcular la diferencia entre el valor máximo y el mínimo (rango)"""
    return x.max() - x.min()

def coefficient_of_variation(x):
    """Calcular el coeficiente de variación (desviación estándar / media)"""
    return x.std() / x.mean() * 100

# Usar una función personalizada para la agregación
# Puedes usar el nombre de la función (cadena) o pasar directamente el objeto función
result = df.groupby('Clase').agg({
    Lengua china: ['sum', 'mean', range_func],  # Para Lengua: suma, media y rango
    Matemáticas: ['sum', 'mean', coefficient_of_variation]  # Matemáticas: suma, promedio, coeficiente de variación
})

print(Estadísticas personalizadas de cada clase:)
print(result)
print()

# También se pueden usar funciones personalizadas directamente en la lista
result2 = df.groupby('Clase')[Matemáticas].agg(['mean', range_func, 'std'])
print(Estadísticas de los puntajes de matemáticas por clase (incluye rango personalizado y desviación estándar):)
print(result2)

Resultado de la ejecución:

学生成绩数据:
   班级  姓名  语文  数学
0  A   张三   85   90
1  A   李四   92   85
2  A   王五   78   92
3  B   赵六   88   78
4  B   孙七   95   88
5  B   周八   82   91
6  B   吴九   90   85
7  A   郑十   87   89

各班级的自定义统计:
               语文                 数学
              sum   mean range_func  sum    mean coefficient_of_variation
班级
A    342  85.5  14.0  425   88.25  5.019099

B    355  88.75  12.0  342   85.5  7.030

各班级数学成绩的统计(包含自定义极差和统计):
班级
A    88.25  5.0  2.692582
B    85.50  13.0  6.0

Análisis del código:

  • Una función personalizada recibe una Serie como parámetro y devuelve un valor escalar.
  • El nombre de la función se puede pasar como cadena (por ejemplo,'sum'), o también se puede pasar directamente el objeto de la función.
  • Con funciones personalizadas se puede implementar cualquier lógica de agregación, por compleja que sea.

Ejemplo 3: Uso de alias de cadena y funciones lambda

agg()Admite múltiples formas de especificar funciones, incluidas expresiones lambda y alias de cadena integrados.

Ejemplo

import pandas as pd

# Crear datos de salario de los empleados
data = {
    'Departamento': [Ventas, Ventas, 'Tecnología', 'Tecnología', Administración, Administración, Ventas, 'Tecnología'],
    Puesto: [Especialista, Gerente, Especialista, Gerente, Especialista, Gerente, Especialista, Gerente],
    'Salario': [5000, 8000, 7000, 12000, 4500, 9000, 5500, 11000],
    Antigüedad: [2, 5, 3, 8, 1, 6, 2, 7]
}
df = pd.DataFrame(data)

print(Datos de salarios de empleados:)
print(df)
print()

# Uso de la función lambda para cálculos personalizados flexibles
# Calcular la diferencia entre la mediana y la media de los salarios de cada departamento
result = df.groupby('Departamento').agg({
    'Salario': [
        ('Salario promedio', 'mean'),  # Asignar un alias al resultado de agregación
        ('Salario máximo', 'max'),
        ('Salario mínimo', 'min'),
        ('Rango salarial', lambda x: x.max() - x.min())
    ],
    Antigüedad: [
        ('Antigüedad promedio', 'mean'),
        ('Antigüedad máxima', 'max'),
        ('Antigüedad mínima', 'min')
    ]
})

print(Estadísticas integrales de salarios y antigüedad por departamento:)
print(result)
print()

# Usar la forma abreviada de agg
result2 = df.groupby('Departamento')['Salario'].agg(
promedio='mean',
suma total='sum',
número de personas='count'
)

print("Resultado de la agregación usando parámetros con nombre:")
print(result2)

Resultado de la ejecución:

员工工资数据:
  部门   岗位    工资   工龄
0  销售   专员  5000    2
1  销售   经理  8000    5
2  技术   专员  7000    3
3  技术   经理  12000   8
4  行政   专员  4500    1
5  行政   经理  9000    6
6  销售   专员  5500    2
7  技术   经理  11000   7

各部门工资和工龄的综合统计:
                   工资                    工龄
            平均工资  最高工资  最低工资  工资极差  平均工龄  最高工龄  最低工龄
部门
技术   10000.0  12000   7000   5000   6.0    8    3
行政   6750.0   9000    4500   4500   3.5    6    1
销售   6166.666667  8000    5000   3000   3.0    5    1

使用命名参数形式的聚合结果:
          平均     总和   人数
部门
技术    10000.0  30000   3
行政     6750.0  13500   2
销售   6166.666667  18500   3

Análisis del código:

  • Usando una tupla('Alias', 'Nombre de función')se puede asignar un nombre personalizado a la columna de resultados de agregación.
  • Las expresiones lambda se pueden usar directamente enagg()para implementar lógica personalizada simple.
  • La forma de parámetros con nombre (parámetros de palabra clave) permite asignar nombres a las columnas de resultados de forma más intuitiva.

Ejemplo 4: Agrupar por múltiples columnas y usar agg

agg()También se puede usar junto con la agrupación por múltiples columnas para manejar necesidades de análisis de datos más complejas.

Ejemplo

import pandas as pd

# Crear datos de ventas
data = {
    'Región': ['Norte de China', 'Este de China', 'Sur de China', 'Norte de China', 'Este de China', 'Sur de China', 'Norte de China', 'Este de China', 'Sur de China'],
    'Producto': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B', 'C'],
    'Ventas': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100, 1700],
    'Beneficio': [200, 400, 300, 360, 440, 320, 240, 420, 340]
}
df = pd.DataFrame(data)

print("Datos de ventas:")
print(df)
print()

# Agrupar por región y producto, y realizar varias agregaciones de ventas y beneficios
result = df.groupby(['Región', 'Producto']).agg({
    'Ventas': ['sum', 'mean', 'count'],
    'Beneficio': ['sum', 'mean']
})

print("Resultados de agregación después de agrupar por región y producto:")
print(result)
print()

# Usar reset_index para convertir al formato DataFrame normal
result_flat = df.groupby(['Región', 'Producto'], as_index=False).agg({
    'Ventas': ['sum', 'mean'],
    'Beneficio': ['sum', 'mean']
})

# Aplanar el índice de columnas multinivel
result_flat.columns = ['_'.join(col).strip('_') for col in result_flat.columns.values]

print("Resultado después de aplanar:")
print(result_flat)

Resultado de ejecución:

销售数据:
 地区  产品   销售额   利润
0  华北   A   1000  200
1  华东   B   2000  400
2  华南   C   1500  300
3  华北   B   1800  360
4  华东   A   2200  440
5  华南   C   1600  320
6  华北   A   1200  240
7  华东   B   2100  420
9  华南   C    1700  340

按地区和产品分组后的聚合结果:
              销售额            利润
               sum  mean count   sum  mean
地区 产品
华东 A   2200  2200.0     1  440  440.0
     B   4100  2050.0     2  4100  4100.0
华南 C   3100  1550.0     2  3100  1550.0
华北 A   2200  1100.0     2  440  220.0
     B   1800  1800.0     1  360  360.0

展平后的结果:
   地区  产品  销售额_sum  销售额_mean  利润_sum  利润_mean
0  华东   A        2200      2200.0       440       440.0
1  华东   B        4100   2050.0      820       410.0
2  华南   C        3100   1550.0      660       330.0
3  华北   A        2200   1100.0      440       220.0
4  华北   B        1800   1800.0      360       360.0

Análisis del código:

  • Agrupar por varias columnas produce un índice multinivel (MultiIndex).
  • Usaras_index=Falsepuede mantener las columnas de agrupación como columnas normales.
  • A través decolumnsrenombrar, se puede aplanar el índice de columnas multinivel a un solo nivel.

Consejo:agg()Es una de las funciones más utilizadas en la agregación por grupos. No solo puede calcular múltiples indicadores estadísticos de una sola vez, sino que también admite funciones personalizadas, con una flexibilidad muy alta. Se recomienda dominar sus diversos usos en proyectos reales.


Funciones comunes de Pandas

Otras extensiones