Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

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


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
новый
Собирайте, анализируйте и интерпретируйте данные, улучшайте бизнес-процессы и продукт компании. Обучитесь работе с библиотеками Python
9 месяцев
с нуля
Старт 28 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»