Функция Pandas groupby.mean()
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: Базовое использование — группировка по одному столбцу и вычисление среднего
Наиболее базовый вариант использования — сгруппировать по значениям одного столбца, затем вычислить среднее другого столбца.
Пример
# Создать 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
Пояснение к коду:
df.groupby('班级')Группирует учащихся в группы A и B в соответствии со значениями в столбце "班level"..mean(numeric_only=True)Вычисляет среднее для всех числовых столбцов (Chinese, Math, English).- В возвращаемом результате класс служит индексом, а средние значения по каждому предмету служат данными столбцов.
Пример 2: группировка по нескольким столбцам и вычисление среднего
Вы можете группировать по нескольким столбцам одновременно, а затем вычислять среднее по числовым столбцам.
Пример
# Создать данные о продажах
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 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 для распространения среднего по группе обратно на каждую строку исходных данных, что очень полезно при вычислении внутригрупповых пропорций или отклонений от среднего по группе.
Пример
# Создать данные об оценках студентов
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параметра.
Другие расширения