Функция Pandas groupby.mean()

Общие функции Pandas


groupby.mean()является агрегационной функцией в Pandas, используемой для вычисления среднего после группировки. Она используется вместе сgroupby.sum()Используйте её вместе: сначала сгруппируйте данные по значениям столбца, затем вычислите среднее арифметическое числовых столбцов в каждой группе.

В анализе данных вычисление среднего — очень распространённая задача. Например, расчёт средней зарплаты по отделу, среднего объёма продаж по региону, среднего балла по классу и т. д.mean()Функция позволяет быстро решить эти задачи.


Базовый синтаксис и параметры

mean()является методом объекта GroupBy; сначала нужно использоватьgroupby()затем вызвать его после группировки.

Формат синтаксиса

GroupBy.mean(numeric_only=False, engine=None, engine_kwargs=None)

Описание параметра

Параметр Type Описание Значение по умолчанию
numeric_only bool Если True, вычисляет среднее только для числовых столбцов; если False, пытается вычислить среднее для всех столбцов. False
engine str Задаёт вычислительный движок, который может быть 'cython' или 'numba'. None означает, что Pandas выбирает автоматически. Отсутствует
engine_kwargs dict Словарь дополнительных параметров, передаваемых в базовый движок. Отсутствует

Возвращаемое значение

  • Тип возвращаемого значения:SeriesилиDataFrame
  • Описание: Возвращает результат после группового вычисления среднего. Если используется для одного столбца, возвращает Series; если для нескольких столбцов, возвращает DataFrame.

Примеры

Давайте разберём серию примеров от простых к сложным, чтобы основательно освоитьgroupby.mean()использование.

Пример 1: Базовое использование — группировка по одному столбцу и вычисление среднего

Наиболее базовый вариант использования — сгруппировать по значениям одного столбца, затем вычислить среднее другого столбца.

Пример

import pandas as pd

# Создать DataFrame с данными об оценках студентов
# Содержит имя студента, класс, оценки по китайскому, математике и английскому
data = {
    'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю', Сунь Ци, Чжоу Ба, У Цзю, Чжэн Ши],
    Класс: ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'A'],
    Китайский: [85, 92, 78, 88, 95, 82, 90, 87],
    Математика: [90, 85, 92, 78, 88, 91, 85, 89],
    Английский: [88, 90, 85, 92, 87, 89, 91, 86]
}

# Создать DataFrame
df = pd.DataFrame(data)

print("Данные об оценках студентов:")
print(df)
print()

# Группировать по "班level" и вычислить средний балл для каждого класса
avg_by_class = df.groupby(Class).mean(numeric_only=True)

print(Средний балл по классам:)
print(avg_by_class)
print()

# Вы также можете вычислить среднее только для одного столбца
math_avg_by_class = df.groupby(Class)[Mathematics].mean()

print(Средний балл по математике для каждого класса:)
print(math_avg_by_class)

Ожидаемый вывод:

学生成绩数据:
   姓名  班级  语文  数学  英语
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

Пояснение к коду:

  1. df.groupby('班级')Группирует учащихся в группы A и B в соответствии со значениями в столбце "班level".
  2. .mean(numeric_only=True)Вычисляет среднее для всех числовых столбцов (Chinese, Math, English).
  3. В возвращаемом результате класс служит индексом, а средние значения по каждому предмету служат данными столбцов.

Пример 2: группировка по нескольким столбцам и вычисление среднего

Вы можете группировать по нескольким столбцам одновременно, а затем вычислять среднее по числовым столбцам.

Пример

import pandas as pd

# Создать данные о продажах
data = {
    'Region': ['North China', 'East China', 'South China', 'North China', 'East China', 'South China', 'North China', 'East China'],
    'product': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
    'Sales amount': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
    Profit: [200, 400, 300, 360, 440, 320, 240, 420]
}
df = pd.DataFrame(data)

print("Данные о продажах:")
print(df)
print()

# Группировка по "Region" и "Product", вычисление средних продаж и прибыли
avg_grouped = df.groupby(['Region', 'product'], as_index=False).mean(numeric_only=True)

print(Средние продажи и прибыль с группировкой по региону и продукту:)
print(avg_grouped)
print()

# Сохранить форму многоуровневого индекса
avg_indexed = df.groupby(['Region', 'product']).mean(numeric_only=True)
print(Результат в формате многоуровневого индекса:)
print(avg_indexed)

Ожидаемый вывод:

销售数据:
  地区  产品   销售额   利润
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

Пояснение к коду:

  • ['Region', 'Product']При использовании списка для группировки по нескольким столбцам,
  • as_index=Falseрезультат представлен в формате DataFrame, а столбцы группировки сохраняются как обычные столбцы.
  • Многоуровневая форма индекса более лаконична и подходит для последующих операций анализа данных.

Пример 3: Вычисление среднего при обработке пропущенных значений

Когда в данных есть пропущенные значения (NaN),mean()он автоматически игнорирует эти пропущенные значения при вычислении.

Пример

import pandas as pd
import numpy as np

# Создать данные о зарплате сотрудников, содержащие пропущенные значения
data = {
    'Department': [Sales, Sales, Sales, 'Technology', 'Technology', 'Technology', Administration, Administration],
    'salary': [5000, 6000, np.nan, 8000, 9000, np.nan, 4500, np.nan]
}
df = pd.DataFrame(data)

print(Данные о зарплате сотрудников (включая пропущенные значения):)
print(df)
print()

# По умолчанию mean() игнорирует значения NaN при вычислении
avg_with_nan = df.groupby('Department')['salary'].mean()
print("По умолчанию среднее вычисляется (игнорируя NaN):")
print(avg_with_nan)
print()

# Если вы хотите учитывать значения NaN как 0 в расчёте, сначала нужно их заполнить
avg_filled = df.groupby('Department')['salary'].apply(lambda x: x.fillna(0).mean())
print(Средняя зарплата после обработки NaN как 0:)
print(avg_filled)
print()

# Используйте параметр skipna (по умолчанию True)
# Если установлено skipna=False, все группы, содержащие NaN, возвращают NaN
# Примечание: у mean из groupby нет параметра skipna, но аналогичного эффекта можно добиться с помощью fillna

Ожидаемый вывод:

员工工资数据(包含缺失值):
  部门   工资
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

Пояснение к коду:

  • По умолчанию,mean()он автоматически игнорирует значения NaN, и они не включаются в расчёт среднего.
  • В отделе продаж есть 2 корректных значения (5000, 6000), среднее — 5500.
  • Если вам нужно считать NaN равным 0 перед вычислением среднего, можно использоватьfillna(0)чтобы сначала заполнить пропущенные значения.
  • Пример 4: Совмещение transform для вычисления внутригрупповых пропорций

    Вы можете использоватьtransformметод transform для распространения среднего по группе обратно на каждую строку исходных данных, что очень полезно при вычислении внутригрупповых пропорций или отклонений от среднего по группе.

    Пример

    import pandas as pd

    # Создать данные об оценках студентов
    data = {
        'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю', Сунь Ци, Чжоу Ба],
        Класс: ['A', 'A', 'A', 'B', 'B', 'B'],
        Китайский: [85, 92, 78, 88, 95, 82],
        Математика: [90, 85, 92, 78, 88, 91]
    }
    df = pd.DataFrame(data)

    print("Данные об оценках студентов:")
    print(df)
    print()

    # Вычислить средний балл по математике для каждого класса, затем распространить его на каждую строку
    df['Class Math Average'] = df.groupby(Class)[Mathematics].transform('mean')

    # Вычислить разницу между баллом каждого ученика и средним по классу
    df['Difference from average score'] = df[Mathematics] - df['Class Math Average']

    print("Данные после добавления среднего по классу и разницы:")
    print(df)
    print()

    # Вычислить для каждого ученика его балл по математике как процент от общего балла класса
    df['Percentage within class'] = (df[Mathematics] / df['Class Math Average'] * 100).round(2)

    print(Данные после добавления процентов:)
    print(df)

    Ожидаемый вывод:

    学生成绩数据:
    姓名  班级  语文  数学
    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   索引
    

    Пояснение к коду:

    • transform('mean')Он вычисляет среднее значение для каждой группы, а затем транслирует его обратно в каждую строку исходных данных.
    • Таким образом, каждый ученик может узнать средний балл своего класса, что упрощает сравнение.
    • Этот метод очень практичен в аналитических сценариях, таких как вычисление «позиции отдельного человека внутри группы».

    Примечания:mean()По умолчанию функция игнорирует значения NaN во время вычисления. Если все данные состоят из пропущенных значений, она возвращает NaN. По сравнению сsum()отличается,mean()нетmin_countпараметра.


    Часто используемые функции Pandas

    Другие расширения