Pandas groupby.agg() función
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
# 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:
['sum', 'mean', 'max', 'min', 'count']Usando una lista se pueden especificar múltiples funciones de agregación a la vez.- 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).
- 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 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
# 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 en
agg()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
# 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).
- Usar
as_index=Falsepuede mantener las columnas de agrupación como columnas normales. - A través de
columnsrenombrar, 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.
Otras extensiones