- Агрегация данных с использованием метода agg()
- Агрегация данных с использованием метода groupby()
- Выводы
Во многих случаях аналитики должны предоставить агрегированные или сгруппированные данные. Эта информация помогает понять общие характеристики в определенных разрезах данных. Часто этого достаточно, чтобы достичь бизнес-цели или принимать решения.
В этом уроке мы продемонстрируем методы работы с инструментами библиотеки 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
# sum 8939.0 9031.0 8842.0 7910.0 NaN
# max 581.0 490.0 581.0 529.0 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.groupby(['Advertising']).agg(['mean', 'median']))
# => SHOP1 SHOP2 SHOP3 SHOP4
# mean median mean median mean median mean median
# Advertising
# large 350.00 319.5 294.41 327.5 309.61 320.0 219.61 312.0
# medium 270.28 312.0 346.37 338.0 260.00 322.5 380.85 344.0
# small 406.71 421.0 389.57 384.0 391.00 399.0 398.16 373.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 350.00 581.0 -265.0 327.5 197.99 39200.26 -477.0 409.0
# medium 270.29 531.0 264.0 338.0 294.71 86851.43 311.0 487.0
# small 406.71 529.0 282.0 384.0 63.02 3971.33 321.0 529.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()
. На практике данные методы применяются довольно часто в силу того, что агрегация данных позволяет выявлять закономерности, тренды и другие информативные показатели.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.