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())

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

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

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

print(
  df_clicks.drop(['Advertising', 'Size'], axis=1)
  .agg('mean')
)

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

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

print(
  df_clicks.drop(['Advertising', 'Size'], axis=1)
  .agg(['max', 'mean'])
)

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

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

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

print(df_clicks.agg(dict_func))

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

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

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

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

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

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

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

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

print(
  df_clicks.drop(columns=['Size'])
  .groupby('Advertising')
  .agg(['mean', 'median'])
)

Значение агрегирующих функций вычислились для каждого столбца, причем для всех категорий из столбца '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)
)

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

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

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

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

print(
  df_clicks.groupby(['Size']).agg(agg_func)
)

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

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

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

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

print(
  df_clicks.sort_values(by='SHOP1')
    .groupby('Advertising')
    .agg(agg_func)
)

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

Выводы

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

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

Завершено

0 / 10