April 21, 2022

Сводные агрегации c Pandas

Рассмотрим, какие агрегирующие функции можно задавать в pivot_table и как определять собственные методы. Для примера будем работать со следующим датафреймом:

import pandas as pd
import numpy as np
df = pd.DataFrame([['Иванов ИИ', 1, 12], ['Федоров АК', 2, np.nan], 
                   ['Арсентьева ВБ', 1, 13],['Черкасова АА', 1, 13],
                  ['Чувашов ВК', 1, None], ['Галанова ББ', 2, 14]], 
                  columns=['fio', 'gr_id', 'revenue'])
df

Для создания сводных статистик можно использовать функцию pivot_table, в параметр aggfunc которой передаются функции агрегации (поддерживаются как строчные наименования, так и ссылки). Например, сгруппируем по полю gr_id и посчитаем метрики для revenue:

df.pivot_table(index='gr_id', values='revenue', aggfunc=['count', np.mean])

К числу наиболее часто используемых статистик относятся count, nunique, min, max, std, sum, mean, median, var, quantile:

df.pivot_table(index='gr_id', values='revenue', 
               aggfunc=['count', 'nunique', 'min', 'max', 'std', 'sum', 
                        'mean', 'median', 'var', 'quantile'])

Обратите внимание, что quantile по умолчанию возвращает медиану, чтобы передать значение квантили можно воспользоваться partial и передать в pivot_table ссылку:

from functools import partial
q_25 = partial(pd.Series.quantile, q=0.25) 

df.pivot_table(index='gr_id', values='revenue', 
               aggfunc=[q_25])

Также в pivot_table можно передавать собственные функции:

def num_vals(col):
    return col.shape[0]

df.pivot_table(index='gr_id', values='revenue', aggfunc=['count', 'mean', num_vals])

И лямбда функции:

df.pivot_table(index='gr_id', values='revenue', aggfunc=['count', 'mean', 
                                                         lambda x: x.shape[0]])