Python: Pandas

Теория: Сводные таблицы

Во многих случаях аналитики должны предоставить агрегированные или сгруппированные данные. Эта информация помогает понять общие характеристики в определенных разрезах данных. Часто этого достаточно, чтобы достичь бизнес-цели или принимать решения.

В этом уроке мы продемонстрируем методы работы с инструментами библиотеки Pandas, чтобы делать такие операции.

Агрегация данных с использованием метода agg()

Функции агрегирования вычисляют интегральные параметры наборов данных. Обычно возвращаемые значения — это несколько чисел. Чаще всего это одно значение для одного столбца данных.

Подгрузим данные:

import pandas as pd

df_clicks = pd.read_csv('./data/Cite_clicks_info.csv', index_col=0)
print(df_clicks.head())
SHOP1  SHOP2  SHOP3  SHOP4 Advertising   Size
day
1    319.0 -265.0  319.0  328.0       small    big
2    292.0  274.0  292.0  301.0      medium  small
3    283.0  301.0  274.0  283.0      medium  small
4    328.0  364.0  328.0    NaN       small  small
5    391.0  355.0  373.0  337.0       small  small

В датасете столбец Advertising со значениями 'small', 'medium', 'large'. Они указывают на объем рекламы в этот день по магазинам, например, 'small' — были низкие объемы рекламы. А также столбец Size со значениями 'small' и 'big', которые указывают на величину магазина.

Примеры агрегаций

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

print(
  df_clicks.drop(['Advertising', 'Size'], axis=1)
  .agg('mean')
)
SHOP1    343.807692
SHOP2    334.481481
SHOP3    315.785714
SHOP4    304.230769
dtype: float64

Мы исключили столбцы 'Advertising', 'Size' в примере выше. Это категории, а не численные показатели. Вычисление функции mean() вызвало бы ошибку на категориальных столбцах.

Посчитаем несколько агрегаций одновременно для одного столбца. Для этого в аргументы метода agg() подадим список с перечислением функций:

print(
  df_clicks.drop(['Advertising', 'Size'], axis=1)
  .agg(['max', 'mean'])
)
SHOP1       SHOP2       SHOP3       SHOP4
max   581.000000  490.000000  581.000000  529.000000
mean  343.807692  334.481481  315.785714  304.230769

Продвинутые примеры агрегаций

С помощью метода agg() можно строить и более сложные примеры. Применим к столбцами различные агрегирующие функции:

dict_func = {
    'SHOP1': ['mean', 'max'],
    'SHOP2': ['mean', 'max'],
    'SHOP3': ['mean', 'max'],
    'SHOP4': ['mean', 'max'],
    'Advertising': ['count'],
}

print(df_clicks.agg(dict_func))
SHOP1       SHOP2       SHOP3       SHOP4  Advertising
mean   343.807692  334.481481  315.785714  304.230769          NaN
max    581.000000  490.000000  581.000000  529.000000          NaN
count         NaN         NaN         NaN         NaN         28.0

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

print(
  df_clicks.agg(
    shop1_mean=('SHOP1', 'mean'),
    shop2_mean=('SHOP2', 'mean'),
    advertising_count=('Advertising', 'count')
  )
)
SHOP1       SHOP2  Advertising
shop1_mean         343.807692         NaN          NaN
shop2_mean                NaN  334.481481          NaN
advertising_count         NaN         NaN         28.0

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

Агрегация данных с использованием метода groupby()

Рассмотрим агрегацию данных через следующие функции:

  • Числовые агрегирующие функции
  • Функции подсчета
  • Функции порядка

Числовые агрегирующие функции

С помощью метода groupby() можно находить значения агрегированных данных по определенным категориям. Вычислим агрегированные значения для дней, когда значение столбца Advertising было 'small', 'medium' и 'large':

print(
  df_clicks.drop(columns=['Size'])
  .groupby('Advertising')
  .agg(['mean', 'median'])
)
SHOP1              SHOP2              SHOP3         \
                   mean median        mean median        mean median
Advertising
large        289.000000  304.0  352.444444  321.0  361.100000  310.0
medium       361.142857  320.0  344.666667  344.0  196.000000  320.0
small        391.222222  360.0  306.333333  384.0  385.222222  360.0

                  SHOP4
                   mean median
Advertising
large        199.888889  320.0
medium       347.333333  328.0
small        373.125000  353.5

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

Можно для каждого столбца находить свои агрегации:

agg_func = {
  'SHOP1': ['mean','max'],
  'SHOP2': ['min', 'median'],
  'SHOP3':['std', 'var'],
  'SHOP4': ['min', 'max']
}

print(
  df_clicks.groupby(['Advertising']).agg(agg_func).round(2)
)
SHOP1         SHOP2          SHOP3             SHOP4
               mean    max    min median     std        var    min    max
Advertising
large        289.00  581.0  264.0  321.0  101.48   10298.10 -477.0  529.0
medium       361.14  487.0  267.0  344.0  324.62  105375.50  283.0  487.0
small        391.22  531.0 -265.0  384.0   69.31    4803.94  328.0  445.0

Метод round() округляет дробную часть до двух знаков после запятой. Форматирование упрощает чтение данных.

Функции подсчета

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

agg_func = {
  'Advertising':['count', 'nunique']
}

print(
  df_clicks.groupby(['Size']).agg(agg_func)
)
Advertising
            count nunique
Size
big             9       3
small          19       3

Функция count подсчитывает количество значений соответствующей категории, функция nunique находит количество уникальных значений в категории. Функция nunique не учитывает пропуски при подсчете.

Функции порядка

В этом разделе покажем, как получать максимальное и минимальное количество кликов магазина по категориям рекламы. Будем использовать функции first() и last():

agg_func = {
  'SHOP1': ['first', 'last']
}

print(
  df_clicks.sort_values(by='SHOP1')
    .groupby('Advertising')
    .agg(agg_func)
)
SHOP1
             first   last
Advertising
large       -424.0  581.0
medium       283.0  487.0
small        319.0  531.0

Чтобы использовать функции порядка датасет, их нужно предварительно упорядочить. Для этого можно использовать метод sort_values().

Выводы

В этом уроке мы познакомились с возможностями библиотеки Pandas по агрегации данных. Разобрали примеры агрегации с помощью метода agg(), а также более сложные примеры с использованием метода groupby(). На практике данные методы применяются довольно часто в силу того, что агрегация данных позволяет выявлять закономерности, тренды и другие информативные показатели.

Рекомендуемые программы