Función groupby.mean() de Pandas

Funciones comunes 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

import pandas as pd

# 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:

  1. df.groupby('班级')Los estudiantes se dividen en dos grupos, A y B, según los valores de la columna "Clase".
  2. .mean(numeric_only=True)Se calcula el promedio de todas las columnas numéricas (chino, matemáticas e inglés).
  3. 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

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'],
    '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 pandas as pd
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 usarfillna(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

    import pandas as pd

    # 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.


    Funciones comunes de Pandas

    Otras extensiones