Функция 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' и т. д.

Пример

import pandas as pd

# Создать 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

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

  1. ['sum', 'mean', 'max', 'min', 'count']Использование списка позволяет указать несколько функций агрегации одновременно.
  2. Возвращаемый результат — это DataFrame, имена столбцов которого состоят из имён функций и исходных имён столбцов (многоуровневый индекс столбцов).
  3. Использование словаря позволяет указать разные функции агрегации для разных столбцов.

Пример 2: Использование пользовательских функций агрегации

Помимо встроенных функций,agg()он также поддерживает пользовательские функции, что значительно расширяет его гибкость.

Пример

import pandas as pd
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()Поддерживается несколько способов указания функций, включая лямбда-выражения и встроенные строковые псевдонимы.

Пример

import pandas as pd

# Создание данных о зарплате сотрудников
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()Его также можно использовать вместе с группировкой по нескольким столбцам для решения более сложных задач анализа данных.

Пример

import pandas as pd

# Создать данные о продажах
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()Это одна из наиболее часто используемых функций в групповой агрегации. Она может вычислять несколько статистических показателей одновременно, а также поддерживает пользовательские функции, что делает её очень гибкой. Рекомендуется освоить её различные варианты использования в реальных проектах.


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

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