Función groupby.mean() de Pandas
groupby.mean()Es una función de agregación en Pandas que se utiliza para calcular el promedio después de agrupar. Se usa junto congroupby.sum()primero se agrupan los datos según los valores de una columna, y luego se calcula la media aritmética de las columnas numéricas en cada grupo.
En el análisis de datos, calcular el promedio es una necesidad muy común. Por ejemplo, el salario promedio de cada departamento, las ventas promedio de cada región, las calificaciones promedio de cada clase, etc.mean()La función puede completar estas tareas rápidamente.
Sintaxis básica y parámetros
mean()Es una función miembro del objeto GroupBy, es necesario usar primerogroupby()agrupar y luego llamarla.
Formato de sintaxis
GroupBy.mean(numeric_only=False, engine=None, engine_kwargs=None)
Descripción de parámetros
| Parámetro | Tipo | Descripción | Valor predeterminado |
|---|---|---|---|
| numeric_only | bool | Si es True, solo calcula el promedio de las columnas numéricas; si es False, intenta calcular el promedio de todas las columnas. | False |
| engine | str | Especifica el motor de cálculo, puede ser 'cython' o 'numba'. None indica que Pandas lo selecciona 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ónDevuelve el resultado del promedio calculado por grupos. Si se usa en una sola columna, devuelve una Serie; si se usa en varias columnas, devuelve un DataFrame.
Ejemplos
Aprendamos completamente, mediante una serie de ejemplos de simples a complejos,groupby.mean()el uso de la función.
Ejemplo 1: Uso básico: calcular el promedio agrupando por una sola columna
El uso más básico es agrupar según los valores de una columna y luego calcular el promedio de otra columna.
Ejemplo
# Crear un DataFrame con los datos de calificaciones de los estudiantes
# Contiene el nombre del estudiante, la clase, y las calificaciones de chino, matemáticas e inglés
data = {
'Nombre': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', Sun Qi, Zhou Ba, Wu Jiu, Zheng Shi],
'Clase': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'A'],
Lengua china: [85, 92, 78, 88, 95, 82, 90, 87],
Matemáticas: [90, 85, 92, 78, 88, 91, 85, 89],
Inglés: [88, 90, 85, 92, 87, 89, 91, 86]
}
# Crear el DataFrame
df = pd.DataFrame(data)
print(Datos de calificaciones de estudiantes:)
print(df)
print()
# Agrupar por "班级" y calcular la calificación promedio de cada clase
avg_by_class = df.groupby('Clase').mean(numeric_only=True)
print(Calificación promedio de cada clase:)
print(avg_by_class)
print()
# También se puede calcular el promedio solo para una columna específica
math_avg_by_class = df.groupby('Clase')[Matemáticas].mean()
print("La calificación promedio de matemáticas de cada clase:")
print(math_avg_by_class)
Resultado esperado al ejecutar:
学生成绩数据:
姓名 班级 语文 数学 英语
0 张三 A 85 90 88
1 李四 A 92 85 90
2 王五 A 78 92 85
3 赵六 B 怎么办 78 92
4 孙七 B 95 88 87
5 周八 B 82 91 89
6 吴九 B 90 85 91
7 郑十 A 87 89 86
每个班级的平均成绩:
语文 数学 英语
班级
A 85.500000 89.000000 87.250000
B 88.750000 85.500000 89.750000
每个班级的数学平均成绩:
班级
A 89.0
B 85.5
dtype: float64
Análisis del código:
df.groupby('班级')Los estudiantes se dividen en dos grupos, A y B, según los valores de la columna "Clase"..mean(numeric_only=True)Se calcula el promedio de todas las columnas numéricas (chino, matemáticas e inglés).- En el resultado devuelto, la clase actúa como índice y los promedios de cada materia aparecen como datos de columna.
Ejemplo 2: Calcular el promedio agrupando por múltiples columnas
Se puede agrupar por varias columnas al mismo tiempo y luego calcular el promedio de las columnas numéricas.
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'],
'Producto': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
'Ventas': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
Beneficio: [200, 400, 300, 360, 440, 320, 240, 420]
}
df = pd.DataFrame(data)
print(Datos de ventas:)
print(df)
print()
# Agrupar por "Región" y "Producto", calcular el promedio de ventas y beneficios
avg_grouped = df.groupby(['Región', 'Producto'], as_index=False).mean(numeric_only=True)
print("Promedio de ventas y beneficios agrupados por región y producto:")
print(avg_grouped)
print()
# Mantener la forma de índice multinivel
avg_indexed = df.groupby(['Región', 'Producto']).mean(numeric_only=True)
print(Resultados en formato de índice multinivel:)
print(avg_indexed)
Resultado esperado al ejecutar:
销售数据:
地区 产品 销售额 利润
0 华北 A 1000 200
1 华东 B 2000 reset_index
2 华南 C 1500 300
3 华北 B 1800 360
4 华东 A 保留 440
5 对齐 C 1600 320
6 华北 A 1200 240
7 华东 B 2100 420
按地区和产品分组后的平均销售额和利润:
地区 产品 销售额 利润
0 华东 A 2200.0 440.结果
1 华东 B 2050.0 410.0
2 华南 C 1550.0 310. 产品
3 华北 A 1100.0 220.0
4 华北 B 1800.0 360.()
多级索引形式的结果:
销售额 利润
地区 产品
华东 A 2200.0 440.0
B 2050.0 410.0
华南 C 1550.0 310.0
华北 A 1100.0 0
B 1800() 360.0
Análisis del código:
['región', 'producto']Usar una lista permite agrupar por varias columnas a la vez.as_index=FalseCuando se usa as_index=False, el resultado es un DataFrame y las columnas de agrupación se conservan como columnas normales.- La forma de índice multinivel es más concisa y adecuada para operaciones posteriores de análisis de datos.
Ejemplo 3: Cálculo del promedio al manejar valores faltantes
Cuando hay valores faltantes (NaN) en los datos,mean()se ignoran automáticamente estos valores faltantes para el cálculo.
Ejemplo
import numpy as np
# Crear datos de salarios de empleados con valores faltantes
data = {
'Departamento': [Ventas, Ventas, Ventas, 'Tecnología', 'Tecnología', 'Tecnología', Administración, Administración],
'Salario': [5000, 6000, np.nan, 8000, 9000, np.nan, 4500, np.nan]
}
df = pd.DataFrame(data)
print("Datos de salarios de empleados (con valores faltantes):")
print(df)
print()
# Por defecto, mean() ignora los valores NaN al calcular
avg_with_nan = df.groupby('Departamento')['Salario'].mean()
print("Cálculo del promedio por defecto (ignorando NaN):")
print(avg_with_nan)
print()
# Si se desea incluir los valores NaN como 0, primero hay que rellenarlos
avg_filled = df.groupby('Departamento')['Salario'].apply(lambda x: x.fillna(0).mean())
print("Salario promedio después de tratar NaN como 0:")
print(avg_filled)
print()
# Usar el parámetro skipna (por defecto True)
# Si se establece skipna=False, todos los grupos con NaN devuelven NaN
# Nota: el mean de groupby no tiene un parámetro skipna, pero se puede lograr un efecto similar con fillna
Resultado esperado al ejecutar:
员工工资数据(包含缺失值): 部门 工资 0 销售 5000.0 1 销售 6000.0 2 销售 NaN 3 技术 销售 8000.0 4 技术 9000.0 5 技术 NaN 销售 行政 4500 .0 7 行政 NaN 默认计算平均值(忽略NA N): 部门 技术 8500.0 行政 4500.0 销售 5500.0 dtype: float64 将NaN视为0后的平均工资: 部门 技术 5666.666667 行政 2250.0 销售 3666.666667 dtype: float64
Análisis del código:
- Por defecto,
mean()se ignoran automáticamente los valores NaN y no participan en el cálculo del promedio. - El departamento de ventas tiene 2 valores válidos (5000, 6000), el promedio es 5500.
- Si es necesario tratar NaN como 0 y luego calcular el promedio, se puede usar
fillna(0)para rellenar primero los valores faltantes.
Ejemplo 4: Calcular la proporción dentro del grupo usando transform
Se puedetransformmediante el método transform, transmitir el promedio del grupo de vuelta a cada fila de los datos originales, lo cual es muy útil para calcular la proporción dentro del grupo o la diferencia con el promedio del grupo.
Ejemplo
# Crear datos de calificaciones de estudiantes
data = {
'Nombre': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', Sun Qi, Zhou Ba],
'Clase': ['A', 'A', 'A', 'B', 'B', 'B'],
Lengua china: [85, 92, 78, 88, 95, 82],
Matemáticas: [90, 85, 92, 78, 88, 91]
}
df = pd.DataFrame(data)
print(Datos de calificaciones de estudiantes:)
print(df)
print()
# Calcular la calificación promedio de matemáticas de cada clase y luego transmitirla a cada fila
df[Promedio de matemáticas de la clase] = df.groupby('Clase')[Matemáticas].transform('mean')
# Calcular la diferencia entre la calificación de cada estudiante y el promedio de la clase
df[Diferencia respecto al promedio] = df[Matemáticas] - df[Promedio de matemáticas de la clase]
print("Datos después de añadir el promedio de la clase y la diferencia:")
print(df)
print()
# Calcular el porcentaje de la calificación de matemáticas de cada estudiante respecto al total de la clase
df[Porcentaje dentro de la clase] = (df[Matemáticas] / df[Promedio de matemáticas de la clase] * 100).round(2)
print(Datos después de añadir porcentajes:)
print(df)
Resultado esperado al ejecutar:
学生成绩数据: 姓名 班级 语文 数学 0 张三 A 85 保持 1 李四 A 92 索引 2 王五 A 索引 3 平均值 赵六 B 计算 78 4 孙七 B 95 88 5 周八 B 82 91 添加班级平均分和差值后的数据: 姓名 班级 语文 数学 班级数学平均分 与平均分差值 0 张三 A 85 90 89.000000 1.000000 1 李四 A 92 85 89.重新分组 -4.000000 3 王五 A 78 92 89.000000 3.000000 4 赵六 B 88 78 85.666667 -7.666667 5 孙七 B 95 88 85.666667 2.333333 6 先 B 82 91 85.666667 5.333333 添加百分比后的数据: 班级 班级 数学 班级数学平均分 与平均分差值 班级内百分比 0 A 10000 90 89.0 1.0 101.12 1 A 0.3 索引
Análisis del código:
transform('mean')Se calcula el promedio de cada grupo y luego se transmite de vuelta a cada fila de los datos originales.- Así cada estudiante puede conocer el promedio de su clase, lo que facilita la comparación.
- Este método es muy útil en escenarios de análisis como calcular la "posición del individuo dentro del grupo".
Notas:
mean()La función ignora los valores NaN de forma predeterminada al calcular. Si todos los datos son valores faltantes, devuelve NaN. En comparación consum()diferente,mean()no tienemin_countparámetro.
Otras extensiones