Python сводные таблицы – Полное руководство
Вы, возможно, знакомы с использованием сводных таблиц в Excel для быстрого получения информации из ваших данных. В этом посте вы узнаете, как создать сводные таблицы в Python и Pandas с использованием метода .pivot_table()
. Этот пост даст вам полное представление о том, как использовать функцию
Быстрое суммирование данных является важным навыком, позволяющим получить представление о том, как выглядят ваши данные. Данная функция имеет много общего с методом .groupby()
, также доступным в Pandas, но предлагает значительно больше возможностей настройки, как мы увидим далее в этом посте.
К концу этого руководства вы научитесь:
Как использовать функцию
pivot_table(
) и что представляют собой ее параметрыКак сгруппировать данные с помощью индекса или мультииндекса
Как еще больше повернуть таблицу, используя индексы и столбцы
Как указать и создать собственные методы агрегации
Как подсчитать итоги и справиться с недостающими данными
Содержание
Как построить сводную таблицу в Python
Сводная таблица - это таблица статистики, которая помогает суммировать данные большей таблицы путем "поворота" этих данных. Microsoft Excel сделал сводные таблицы популярными, где они известны как PivotTables. Библиотека Pandas предоставляет возможность создавать сводные таблицы в Python с использованием функции .pivot_table()
. Функция имеет следующие параметры по умолчанию:
Метод принимает DataFrame, а затем также возвращает DataFrame. В таблице ниже представлен обзор различных параметров, доступных в функции:
data=
DataFrame для поворота
values=
Столбец для агрегирования (если он пуст, будут агрегированы все числовые значения).
index=
Столбец или столбцы, по которым группируются данные. Один столбец может быть строкой, а несколько столбцов должны представлять собой список строк.
columns=
Столбец или столбцы, по которым группируются данные. Один столбец может быть строкой, а несколько столбцов должны представлять собой список строк.
aggfunc=
‘mean’
Функция или список функций для агрегирования данных по
fill_value=
Значение для замены отсутствующих значений
margins=
False
Добавьте строку и столбец для итогов
dropna=
True
Чтобы не включать столбцы, в которых все записи имеют значение NaN.
margins_name=
‘All’
Название итоговой строки/столбца
observed=
False
Только для категориальных данных — если True
, будут отображаться только наблюдаемые значения для категориальных групп.
sort=
True
Сортировать ли полученные значения
Функция, по-разному, работает над преобразованием большого набора данных в широкий, но также предоставляет агрегации. Для выполнения обратной операции можно использовать функцию Pandas melt(), которая преобразует широкий DataFrame в длинный
Теперь, когда у вас есть понимание различных параметров, доступных в функции, давайте загрузим наш набор данных и начнем исследовать наши данные.
Загрузка образца DataFrame Pandas
Чтобы следовать этому уроку, давайте загрузим пример DataFrame Pandas. Мы можем загрузить DataFrame из файла, размещенного на моей странице GitHub, используя функцию pd.read_excel()
. Затем мы можем распечатать первые пять записей набора данных, используя метод
Основываясь на выводе первых пяти строк, показанных выше, мы видим, что у нас есть пять столбцов для работы:
Date
Дата транзакции
Region
Регион сделки
Type
Тип продаваемой одежды
Units
Количество проданных единиц
Sales
Стоимость продажи
Теперь, когда у нас есть немного больше контекста данных, давайте рассмотрим создание нашей первой сводной таблицы в Pandas.
Создание сводной таблицы в Pandas
Создадим вашу первую сводную таблицу Pandas. Как минимум, мы должны передать какой-либо ключ группировки, используя параметры index=
или columns=
. В приведенных ниже примерах мы используем функцию Pandas, а не функцию DataFrame. По этой причине нам нужно передать аргумент data=
. Если бы мы применили метод непосредственно к DataFrame, это было бы подразумеваемо.
Давайте разберем, что здесь произошло:
Мы создали новый DataFrame под названием
sales_by_region
, который был создан с использованием функцииМы передали наш DataFrame,
df
, и установилиindex='region'
, что означает, что данные будут сгруппированы по столбцу региона
Ввиду того, что все остальные параметры были оставлены по умолчанию, библиотека Pandas сделала следующее предположение:
Данные должны агрегироваться по среднему значению каждого столбца
Значения должны быть любыми числовыми столбцами
Агрегирование только определенных столбцов в сводной таблице Pandas
В приведенном выше примере вы не изменили параметр values=
. Из-за этого были агрегированы все числовые столбцы. Это может быть не всегда идеальным решением. По этой причине Pandas позволяет нам передавать либо одну строку, представляющую один столбец, либо список строк, представляющих несколько столбцов.
Давайте теперь модифицируем наш код, чтобы рассчитать среднее значение только для одного столбца,
Вместо того, чтобы агрегировать все числовые столбцы, был агрегирован только указанный столбец.
Работа с методами агрегирования в сводной таблице Pandas
Теперь, когда вы создали свою первую сводную таблицу в Pandas, давайте работать над изменением методов агрегации. Это позволяет вам указать, как вы хотите агрегировать свои данные. Именно здесь проявляется мощь Pandas, позволяя вам легко проводить сложные анализы.
Указание метода агрегирования в сводной таблице Pandas
Вы можете использовать параметр aggfunc=
(функция агрегирования) для изменения способа агрегирования данных в сводной таблице. По умолчанию Pandas будет использовать метод .mean()
для агрегирования данных. Вы можете передать именованную функцию, такую как 'mean'
, 'sum'
, или 'max'
, или вызываемую функцию, такую как
Давайте теперь попробуем изменить наше поведение, чтобы получить сумму наших продаж по всем регионам:
Множественный Метод Агрегирования в Pandas DataFrame
Аналогичным образом, мы можем указать несколько методов агрегации для сводной таблицы Pandas. Это достаточно просто и требует только передачи списка функций, и функция будет применена ко всем столбцам значений. Давайте произведем агрегации как для среднего значения, так и для суммы:
Мы можем видеть, насколько это было легко и сколько дополнительных данных теперь доступно! Для каждого столбца с числовыми данными создаются как среднее значение, так и сумма.
Указание Различных Агрегаций для Каждого Столбца
Чтобы рассчитать различные агрегации по каждому столбцу, можно передать словарь в следующем формате ключ-значение: 'столбец': функция
. Допустим, мы хотим рассчитать сумму единиц и среднее количество продаж:
Это позволяет вам легко сравнивать данные по различным ключевым показателям эффективности в одном DataFrame.
Пользовательские агрегации в сводных таблицах Pandas
Pandas позволяет также передавать в функцию .pivot_table()
пользовательские функции. Это значительно расширяет наши возможности для проведения анализов, точно настроенных под ваши потребности! Давайте посмотрим, как мы можем передать функцию, которая вычисляет среднее значение колонки без выбросов.
Pandas предоставляет метод .quantile()
, который позволяет нам определить диапазон значений, которые мы хотим выбрать на основе их процентного соотношения в диапазоне данных. Допустим, мы хотели бы рассчитать среднее значение столбца, исключая верхние и нижние 10% данных. Мы могли бы определить следующую функцию:
Эта функция принимает один параметр, values
, который будет передан функцией .pivot_table()
. Затем значения фильтруются с помощью метода .quantile()
. В конце вычисляется среднее значение этих данных. Давайте посмотрим, как мы можем использовать это (и обычную агрегацию mean
) в нашей сводной таблице, применённой к нашему столбцу Sales.
Более сложные сводные таблицы Pandas
Теперь, когда вы поняли, как работает функция .pivot_table()
в Pandas, давайте посмотрим, как мы можем расширить наше понимание. В этом разделе вы узнаете, как добавлять колонки и множественные индексы к нашим сводным таблицам в Pandas.
Добавление столбцов к сводной таблице Pandas
При добавлении столбцов в сводную таблицу Pandas мы добавляем к данным еще одно измерение. В то время как параметр index=
делит данные по вертикали, параметр columns=
группирует данные и разделяет их по горизонтали. Это позволяет нам создать легко читаемую таблицу. Давайте посмотрим, как мы можем использовать параметр columns=
для разделения данных по столбцу Type.
Мы видим, насколько легко было добавить совсем другое измерение данных. Это позволяет нам замечать различия между группами в формате, который легко читать.
Добавление нескольких индексов в сводные таблицы Pandas
Добавление множественных индексов с иерархией данных
В добавок к добавлению горизонтального измерения с помощью колонок, мы также можем определить множественные индексы, когда в наших данных присутствует логическая иерархия. Например, мы можем добавить измерение даты к нашей сводной таблице. Давайте использовать встроенные в Pandas аксессоры даты для группировки наших данных по кварталам. Это позволит нам визуализировать наши данные за определенный период времени. Давайте посмотрим, как это работает:
Это возвращает DataFrame Pandas с мультииндексом. Хотя это может выглядеть сложнее, доступ к данным в DataFrame Pandas с мультииндексом работает довольно похожим образом, как и доступ к данным в любом другом DataFrame. Однако, поскольку теперь у нас есть два индексных столбца, а не один, мы можем передать кортеж индексов. Допустим, мы хотели бы получить доступ только к пересечению Восточного региона, Первого квартала и Мужской одежды, мы могли бы использовать следующий код:
Настройка сводных таблиц Pandas
Настройка сводных таблиц Pandas
В этом разделе вы узнаете, как настраивать сводные таблицы Pandas, чтобы добавить дополнительные настройки, такие как добавление итогов и работа с отсутствующими данными. Вы также научитесь заполнять пропущенные данные в результирующей сводной таблице конкретным значением.
Добавление Итогов к Сводным Таблицам Pandas
Добавление итогов к таблице сводки в Pandas управляется параметром margins=
, который принимает булево значение. По умолчанию этот параметр установлен в False
, но если его изменить на True
, то к строкам и столбцам будут добавлены итоги. Давайте посмотрим, как это выглядит:
По умолчанию Pandas называет итоговые значения 'All'
. Если вы хотите переименовать эти метки, можно использовать параметр margins_name=
, чтобы передать строку для переименования значений.
Обработка пропущенных данных в сводной таблице Pandas
Когда Pandas сталкивается с пересечением, где отсутствуют данные, он включает значение NaN
в полученную сводную таблицу. Давайте модифицируем наш DataFrame, чтобы включить некоторые пропущенные данные, и вычислим сводную таблицу, чтобы увидеть, как это выглядит:
Возможность увидеть значение NaN
может быть не всегда идеальной, особенно для не технической аудитории. Именно по этой причине Pandas предлагает параметр fill_value=
, который позволяет вам передать значение для заполнения этих пропущенных данных. Например, если мы хотим заполнить все эти значения нулями, мы можем просто передать этот аргумент:
Сортировка данных в сводной таблице Pandas
Начиная с версии Pandas 1.3.0, был добавлен новый параметр, который позволяет сортировать получаемый DataFrame. Раньше для этого необходимо было сначала создать DataFrame, а затем применить метод для сортировки данных. Теперь можно просто использовать аргумент sort=True
, чтобы отсортировать получаемый DataFrame.
По умолчанию Pandas будет сортировать сводную таблицу в порядке возрастания. К сожалению, для более сложной сортировки (например, по разным столбцам) вам все равно придется использовать метод
Фильтрация сводных таблиц Python
В этом разделе вы узнаете, как фильтровать сводную таблицу Pandas. Поскольку сводные таблицы часто бывают довольно большими, их фильтрация может существенно сузить результаты. Поскольку функция возвращает DataFrame, вы можете фильтровать DataFrame, как и любой другой. Давайте воссоздадим нашу сводную таблицу, суммируя значения по кварталам и регионам.
Мы можем фильтровать данные либо по скалярному значению, либо по динамическому. Например, можно установить фильтр на основе жёстко заданного значения. Но если мы хотим отображать только те записи, где средние продажи выше общего среднего, мы можем использовать следующий фильтр:
Это позволяет нам видеть именно то, что мы хотим видеть!
Упражнения
Пришло время проверить ваши знания! Попробуйте решить приведенные ниже упражнения, опираясь на то, что вы узнали. Если вам нужна помощь или вы хотите проверить свое решение, раскройте раздел, чтобы увидеть образец решения. Используйте тот же DataFrame, что и во всем учебнике.
Question 1
Question 2
Question 3
Как удалить строку с итогами (все) из сводной таблицы?
Иногда вам может потребоваться получить только итоги по столбцам в вашем итоговом DataFrame. В этом случае вы можете просто отфильтровать последнюю строку, используя отрицательный индекс:
Какое значение может быть не лучшим выбором в качестве параметра fill_value и почему?
Рекомендуется использовать числовые типы данных (такие как целые числа и числа с плавающей точкой), чтобы предотвратить преобразование столбцов в такие, с которыми нельзя выполнять математические операции. Поскольку столбцы в Pandas однородны, важно помнить о возможных последствиях.
В каком регионе были самые высокие продажи DataFrame? Как бы вы получили название региона программно?
Вы можете отсортировать свою сводную таблицу, а затем использовать аксессор .index
для доступа к последнему значению (так как данные отсортированы в порядке возрастания).
Заключение и резюме
В этом уроке вы научились использовать функцию .pivot_table()
в Pandas для создания сводных таблиц в стиле Excel непосредственно из DataFrame в Pandas. Функция предоставляет значительную гибкость за счет большого ассортимента параметров. Ниже представлено краткое описание того, что вы узнали:
Функция
pivot_table()
в библиотеке Pandas предоставляет привычный интерфейс для создания сводных таблиц в стиле Excel.Функция требует указания как минимум одного из параметров:
index=
илиcolumns=
, для определения способа разделения данных.Функция может выполнять один или несколько методов агрегирования, включая использование пользовательских функций.
Функция возвращает DataFrame, который может быть отфильтрован или запрошен так же, как и любой другой DataFrame.
Дополнительные ресурсы
Чтобы узнать больше о смежных темах, ознакомьтесь с нижеприведенными учебными пособиями:
Pandas GroupBy: группировка, суммирование и агрегирование данных в Python
Last updated