Функция Pandas groupby.agg()
Часто используемые функции Pandas
groupby.agg()Это одна из самых мощных функций агрегации в Pandas, позволяющая одновременно применять несколько различных функций агрегации к сгруппированным данным.
иsum()、mean()В отличие от отдельных агрегатных функций, таких как sum, mean и т. д.,agg()она может вычислять несколько статистических показателей одновременно, например, вычислять сумму, среднее, максимум, минимум и т. д. для каждой группы одновременно.
При анализе данных часто необходимо одновременно проводить несколько статистических анализов данных,agg()и эта функция может сделать процесс кратким и эффективным.
Базовый синтаксис и параметры
agg()Это метод экземпляра объекта GroupBy; сначала нужно использоватьgroupby()groupby() для группировки данных, а затем вызвать его.
Формат синтаксиса
GroupBy.agg(func=None, axis=0, *args, engine=None, engine_kwargs=None, **kwargs)
Описание параметра
| Параметр | Type | Описание | Значение по умолчанию |
|---|---|---|---|
| func | str, list, dict или callable | Функция агрегации. Это может быть имя одной функции, список функций или словарь, задающий разные функции для каждого столбца. | Отсутствует |
| axis | int | Направление оси для применения агрегации; 0 означает по строкам (измерение группировки), а 1 — по столбцам. | 0 |
| args | tuple | Дополнительные позиционные аргументы, передаваемые в функцию агрегации. | () |
| engine | str | Задаёт вычислительный движок, который может быть 'cython' или 'numba'. None означает, что Pandas выберет автоматически. | Отсутствует |
| engine_kwargs | dict | Словарь дополнительных параметров, передаваемых в базовый движок. | Отсутствует |
Возвращаемое значение
- Тип возвращаемого значения:
SeriesилиDataFrame - Описание: Возвращает результат после групповой агрегации; структура результата зависит от параметра func и способа группировки.
Пример
Давайте досконально освоим с помощью серии примеров от простых к сложнымgroupby.agg()использование agg().
Пример 1: Использование встроенных функций агрегации
Самый простой способ — напрямую использовать встроенные имена агрегатных функций Pandas, такие как 'sum', 'mean', 'max', 'min', 'count' и т. д.
Пример
# Создать DataFrame с данными о продажах
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': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
'Количество': [10, 20, 15, 18, 22, 16, 12, 21]
}
df = pd.DataFrame(data)
print(Исходные данные о продажах:)
print(df)
print()
# Группировать по 'Region' и применить несколько агрегатных функций к столбцу 'Sales'
# Использовать список строк для указания нескольких агрегатных функций
result = df.groupby('Region')['Sales'].agg(['sum', 'mean', 'max', 'min', 'count'])
print(Сводная статистика продаж по регионам:)
print(result)
print()
# Агрегируйте оба столбца 'Sales' и 'Quantity'
result_all = df.groupby('Region').agg({
'Sales': ['sum', 'mean'],
'Quantity': ['sum', 'mean']
})
print(Комплексная статистика продаж и количества по регионам:)
print(result_all)
Вывод:
原始销售数据:
地区 产品 销售额 数量
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
Пояснение к коду:
['sum', 'mean', 'max', 'min', 'count']Использование списка позволяет указать несколько функций агрегации одновременно.- Возвращаемый результат — это DataFrame, имена столбцов которого состоят из имён функций и исходных имён столбцов (многоуровневый индекс столбцов).
- Использование словаря позволяет указать разные функции агрегации для разных столбцов.
Пример 2: Использование пользовательских функций агрегации
Помимо встроенных функций,agg()он также поддерживает пользовательские функции, что значительно расширяет его гибкость.
Пример
import numpy as np
# Создать данные об оценках студентов
data = {
'Class': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'A'],
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Zhao Liu', 'Sun Qi', 'Zhou Ba', 'Wu Jiu', 'Zheng Shi'],
'Китайский': [85, 92, 78, 88, 95, 82, 90, 87],
'Математика': [90, 85, 92, 78, 88, 91, 85, 89]
}
df = pd.DataFrame(data)
print(Данные об оценках студентов:)
print(df)
print()
# Определить пользовательские агрегатные функции
def range_func(x):
"""Вычислить разность между максимальным и минимальным значениями (размах)"""
return x.max() - x.min()
def coefficient_of_variation(x):
"""Вычислить коэффициент вариации (стандартное отклонение / среднее значение)"""
return x.std() / x.mean() * 100
# Используйте пользовательские функции для агрегации
# Вы можете использовать имя функции (строку) или напрямую передать объект функции
result = df.groupby('Class').agg({
'Chinese': ['sum', 'mean', range_func], # Для Chinese: sum, mean, размах
'Math': ['sum', 'mean', coefficient_of_variation] # Для Math: sum, mean, коэффициент вариации
})
print(Пользовательская статистика для каждого класса:)
print(result)
print()
# Вы также можете напрямую использовать пользовательские функции в списке
result2 = df.groupby('Class')['Math'].agg(['mean', range_func, 'std'])
print(Статистика баллов по математике для каждого класса (включая пользовательский размах и стандартное отклонение):)
print(result2)
Вывод:
学生成绩数据:
班级 姓名 语文 数学
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
Пояснение к коду:
- Пользовательская функция получает Series в качестве параметра и возвращает скалярное значение.
- Имена функций можно передавать в виде строк (например,
'sum'), или можно напрямую передать объект функции. - Использование пользовательских функций позволяет реализовать сколь угодно сложную логику агрегации.
Пример 3: использование строковых псевдонимов и лямбда-функций
agg()Поддерживается несколько способов указания функций, включая лямбда-выражения и встроенные строковые псевдонимы.
Пример
# Создание данных о зарплате сотрудников
data = {
'Department': ['Sales', 'Sales', 'Technology', 'Technology', 'Administration', 'Administration', 'Sales', 'Technology'],
'Position': ['Specialist', 'Manager', 'Specialist', 'Manager', 'Specialist', 'Manager', 'Specialist', 'Manager'],
'Зарплата': [5000, 8000, 7000, 12000, 4500, 9000, 5500, 11000],
'Стаж работы': [2, 5, 3, 8, 1, 6, 2, 7]
}
df = pd.DataFrame(data)
print(Данные о зарплате сотрудников:)
print(df)
print()
# Используйте лямбда-функции для гибких пользовательских вычислений
# Вычислите разницу между медианной и средней зарплатой для каждого отдела
result = df.groupby('Department').agg({
'Зарплата': [
('Средняя зарплата', 'mean'), # Присвойте псевдонимы результатам агрегации
('Максимальная зарплата', 'max'),
('Минимальная зарплата', 'min'),
('Диапазон зарплат', lambda x: x.max() - x.min())
],
'Стаж работы': [
('Средний стаж работы', 'mean'),
('Максимальный стаж работы', 'max'),
('Минимальный стаж работы', 'min')
]
})
print(Комплексная статистика по зарплате и стажу работы для каждого отдела:)
print(result)
print()
# Использование краткой формы agg
result2 = df.groupby('Department')['Salary'].agg(
Average='mean',
Sum='sum',
Count='count'
)
print(Результат агрегирования с использованием именованных параметров:)
print(result2)
Вывод:
员工工资数据:
部门 岗位 工资 工龄
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
Пояснение к коду:
- Использование кортежа
('Alias', 'Function Name')можно задать пользовательское имя для столбца результата агрегирования. - Лямбда-выражения можно напрямую использовать в
agg()для реализации простой пользовательской логики. - Форма с именованными параметрами (ключевые аргументы) позволяет более интуитивно задавать имена для столбцов результата.
Пример 4: Группировка по нескольким столбцам и использование agg
agg()Его также можно использовать вместе с группировкой по нескольким столбцам для решения более сложных задач анализа данных.
Пример
# Создать данные о продажах
data = {
'Region': ['North China', 'East China', 'South China', 'North China', 'East China', 'South China', 'North China', 'East China', 'South China'],
'Product': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B', 'C'],
'Sales': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100, 1700],
'profit': [200, 400, 300, 360, 440, 320, 240, 420, 340]
}
df = pd.DataFrame(data)
print("Данные о продажах:")
print(df)
print()
# Группировка по региону и продукту, выполнение нескольких агрегаций по продажам и прибыли
result = df.groupby(['Region', 'Product']).agg({
'Sales': ['sum', 'mean', 'count'],
'Profit': ['sum', 'mean']
})
print("Результаты агрегации, сгруппированные по региону и продукту:")
print(result)
print()
# Используйте reset_index, чтобы преобразовать в обычный формат DataFrame
result_flat = df.groupby(['Region', 'Product'], as_index=False).agg({
'Sales': ['sum', 'mean'],
'Profit': ['sum', 'mean']
})
# Развернуть столбцы MultiIndex
result_flat.columns = ['_'.join(col).strip('_') for col in result_flat.columns.values]
print("Развёрнутый результат:")
print(result_flat)
Вывод:
销售数据:
地区 产品 销售额 利润
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
Анализ кода:
- Группировка по нескольким столбцам создаёт MultiIndex.
- Используйте
as_index=Falseможно сохранить столбцы группировки как обычные столбцы. - С помощью
columnsпереименование может развернуть многоуровневый индекс столбцов в одноуровневый.
Примечание:
agg()Это одна из наиболее часто используемых функций в групповой агрегации. Она может вычислять несколько статистических показателей одновременно, а также поддерживает пользовательские функции, что делает её очень гибкой. Рекомендуется освоить её различные варианты использования в реальных проектах.
Другие расширения