Узнайте, как повернуть Pandas DataFrame и получить ценную информацию
Сводная таблица — это инструмент манипулирования данными, который перестраивает таблицу и иногда объединяет значения для упрощения анализа.
В этой статье мы рассмотрим функцию Pandas pivot_table и то, как использовать различные параметры, которые она предлагает. Мы рассмотрим реальный набор данных от Kaggle, чтобы проиллюстрировать, когда и как использовать функцию pivot_table.
Преимущества сводной таблицы
- Вы можете сгруппировать данные по одному или нескольким столбцам, а затем суммировать значения, используя различные статистические данные, такие как среднее значение, сумма и количество.
- Он имеет простой в использовании синтаксис, который интуитивно позволяет выполнять простые и сложные преобразования данных.
Синтаксис сводной_таблицы
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)
Обязательные параметры:
data
: источник данных в виде pandas DataFrame
Для группировки данных должен присутствовать любой из двух параметров ниже.
index
: столбцы для группировки данных по строкам.columns
: столбцы для группировки данных по столбцам.
Необязательные параметры:
values
: столбцы для агрегирования с помощью функцииaggfunc
.aggfunc
: Функция, используемая для агрегирования значений.fill_value
: значение для замены отсутствующих значений.dropna
: следует ли удалять целые строки или столбцы, содержащие только значения NaN.margins
: включать ли промежуточные итоги по строкам и столбцам.margins_name
: имена меток для промежуточных итогов строки и столбца.observed
: отображаются только наблюдаемые значения для категориальных группировщиков.sort
: сортировать ли результирующие индексы строк.
Возвращает:
Функция pivot_table возвращает DataFrame с суммированными данными, используя переданные ей параметры.
Простая в использовании аналогия. Короче говоря, синтаксис сводной таблицы говорит, что для каждого ‘index’
возвращается ‘aggfunc’
из ‘values’
столбца (столбцов), разделенных (дополнительно сгруппированных) по ‘columns’
.
В наших демонстрациях ниже мы будем использовать эту аналогию, чтобы понять операции.
Данные
В этой статье мы будем использовать набор данных Hotel Reservations от Kaggle, доступный по лицензии Attribution 4.0 International (CC BY 4.0). После изучения и очистки набора данных в этой записной книжке ниже приведен образец DataFrame, который мы будем использовать для демонстрации сводных таблиц в Pandas.
Изучение одного параметра за раз
Параметр «Индекс» (по умолчанию: index = None)
Это столбцы для группировки данных.
pd.pivot_table(data, index='market')
Давайте посмотрим на приведенный выше код, используя аналогию, которую мы упоминали ранее. Для каждого market
нам нужно mean
из всех числовых столбцов (параметр values
по умолчанию относится ко всем столбцам, которые могут обрабатывать параметр aggfunc=’mean’
по умолчанию и отсутствуют в параметре ‘index’
).
Это приводит к тому, что DataFrame сгруппирован по ‘market’
. Значения в каждой ячейке рассчитываются как среднее значение этого столбца (например, количество гостей или стоимость номера) для группы рынков.
Параметр «Столбцы» (по умолчанию: столбцы = Нет)
Это также для группировки данных, но на уровне столбцов.
pd.pivot_table(data, columns='market')
Применяется та же аналогия. Для каждого ‘market’
верните ‘mean’
числовых значений. Группы отображаются по столбцам, и возвращается перенесенный кадр данных в тот, что был в предыдущем разделе.
Параметр «Значения» (по умолчанию: значения = «Нет»)
Это значения, которые будут отображаться в ячейках таблицы. К этим значениям применяется функция агрегирования.
Как упоминалось ранее, мы должны передать параметры data
и по крайней мере index
или columns
, которые группируют данные. Если параметр values
не указан явно, он выводится из данных как столбцы, поддерживающие параметр aggfunc
.
pd.pivot_table(data, index='meal_plan', values = 'room_price').head()
В приведенном выше коде сказано, что для каждой группы ‘meal_plan’
нужно вернуть ‘mean’
из ‘room_price’
значений.
Параметр «Aggfunc» (по умолчанию: aggfunc = «mean»)
Это функция для агрегирования значений (или выбора возвращаемого значения) для каждой группы.
В приведенной ниже таблице указаны наиболее часто используемые параметры aggfunc
и применимы ли они только к числовым функциям или к числовым и категориальным функциям.
Числовые столбцы:
'mean' — среднее значение для каждой группы
'sum' — общая сумма по группе
'median' — среднее значение по группе< br /> 'std' — стандартное отклонение
'var' — дисперсия для каждой группы
'mad' — среднее абсолютное отклонение
'prod' — произведение значений на группу
И числовые, и категориальные столбцы
'count' — количество строк в группе
'min' — минимальное значение в группе
'max' — максимальное значение
'first' — значение первой строки в группе
'last' — значение последней строки
'nunique' — количество уникальных значений в группе
pd.pivot_table(data, index='market', values = 'room_type', aggfunc = 'nunique')
В приведенном выше коде для каждой группы ‘market’
возвращайте число unique
‘room_types’
.
aggfunc
словарь — у нас также могут быть пары {‘values’:’aggfunc’}
словарей, в которых мы передаем разные функции для разных values
столбцов.
pd.pivot_table(data, index = 'market', aggfunc = {'room_type': 'count', 'lead_time':'max', 'room_price': 'mean'})
Здесь для каждой группы ‘market’
верните count
из ‘room_types’
, maximum
‘lead_time’
и average ‘price’
.
df.reset_index()
— результаты, полученные в приведенных выше примерах, группируются по параметру index
, что делает его новым индексом. Вы можете использовать df.reset_index()
, чтобы сбросить этот столбец до обычного столбца, который также добавляет RangeIndex с целыми числами от 0.
Общие сведения о заголовках столбцов с несколькими индексами в сводных таблицах
Прежде чем рассматривать другие параметры сводной_таблицы, давайте коснемся мультииндексных столбцов, которые являются результатом сводной_таблицы, а позже — того, как удалить уровни.
Столбцы с несколькими индексами присутствуют, когда сводная таблица имеет:
Параметр "индекс"
И
несколько параметров "столбца"
И/ИЛИ
несколько параметров "значение"
И/ИЛИ
несколько параметры 'aggfunc'
~ index
и несколько columns
pd.pivot_table(data, index = 'market', columns = ['status','year'], values = 'room_price', aggfunc = 'mean', fill_value=0).head()
В приведенном выше коде мы группируем данные по ‘market’
, а затем возвращаем average
‘room price’
, дополнительно сгруппированные по status
и year
.
Обратите внимание, что для каждого столбца в списке ‘columns’
уровень столбца (иерархия) добавляется в таблицу в порядке от самого внешнего (0) к самому внутреннему (1).
~ index
и несколько values
pd.pivot_table(data, index = 'market', columns = 'status', values = ['nights','month'], aggfunc = 'mean', fill_value=0).head()
Здесь мы группируем данные по ‘market’
, затем возвращаем mean
из значений ‘nights‘
и ‘month’
, сгруппированных по ‘status’.
Уровень values
находится выше уровня columns
, и по умолчанию имена сортируются. (Аргумент sort=False
в настоящее время работает только с индексами строк). В отличие от параметра columns
, все имена хранятся на одном уровне, независимо от длины списка.
~ index
и несколько вариантов aggfunc
pd.pivot_table(data, index = 'market', columns = 'status', values = 'guests', aggfunc = ['mean','max'], fill_value=0).head()
Здесь сгруппируйте данные по ‘market’
, затем верните значения mean
и maximum
столбца ‘guests’
, дополнительно сгруппированные по ‘status’
.
Слой aggfunc
находится на самом высоком уровне. Подобно values
, все параметры aggfunc
удерживаются на одном уровне.
~ index
и несколько вариантов columns
, values
и aggfunc
pd.pivot_table(data, index = 'market', columns = ['status','year'], values = ['lead_time','nights'], aggfunc = ['median','max'], fill_value=0)
Здесь для каждого ‘market’
верните значения median
и maximum
столбцов ‘lead_time’
и ‘mights’
, дополнительно сгруппированные по ‘status’
и ‘year’
.
Обратите внимание, что теперь у нас есть четыре уровня; два уровня для параметра columns
и по одному уровню для аргументов values
и aggfunc
.
Удаление слоев с несколькими индексами
Вы увидите, что df.reset_index()
не будет работать должным образом при наличии иерархии столбцов.
Вот два способа работы с мультииндексом
- объединить/объединить уровни
Используя приведенную выше сводную таблицу, ниже приведены два способа объединения уровней.
- Использование функций
map
иjoin
df.columns.map('_'.join) #Results ['month_Canceled', 'month_Not Canceled', 'nights_Canceled','nights_Not Canceled']
Внутри функции map
вызовите функцию join
и передайте символ-разделитель, в нашем случае подчеркивание. Это возвращает список уровней объединенных столбцов, которые вы затем назначаете именам столбцов фрейма данных, как показано ниже.
df.columns = df.columns.map('_'.join)
Вы также можете указать другие символы или символы в качестве разделителей, например, пустую строку (‘’.join)
, точку (‘.’.join)
или даже слово(‘per’.join)
. Обратите внимание, что уровни объединяются от самого верхнего уровня (уровень 0) к самому внутреннему (уровень -1).
- Использование понимания списка:это полезно, когда вы хотите изменить порядок имен во время слияния.
df.columns = [f'{i}_{j}' for i,j in df.columns]
Приведенный выше код приводит к тому же DataFrame, что и в предыдущем разделе. Этот код говорит, что для каждого столбца, причем i
является самым верхним уровнем, а j
следующим за ним, возвращаются два уровня в указанном порядке (i
, затем j
), разделенные символом подчеркивания.
Теперь предположим, что вам нужен другой порядок имен после слияния. Мы будем использовать DataFrame ниже.
Вы можете объединить, как level1_level0_level2
, используя понимание списка. Здесь используйте три имени переменных для представления уровней (i,j,k)
, затем укажите нужный формат для возврата, например (f’{j}_{i}_{k}’)
.
df.columns = [f'{j} {i} {k}' for i,j,k in df.columns]
В приведенном выше коде мы использовали пробел для разделения имен.
2. Сбросить несколько уровней
Иногда уровень бесполезен.
Чтобы удалить первые два уровня приведенной выше сводной таблицы, используйте df.columns.droplevel(level=position)
.
df.columns = df.columns.droplevel(level = [0,1]) df
Удаление имен «на уровне столбца». После удаления или объединения уровней вы можете использовать df.reset_index()
.
df.reset_index()
Но теперь исходные имена столбцов, которые были переданы в параметр columns
, присутствуют в сброшенном DataFrame. См. ‘year’
выше, которое появляется в неправильном месте в качестве имени нового индекса. Давайте используем df.rename_axis()
, чтобы удалить это имя.
df2 = df.rename_axis(columns=None) df2.reset_index()
Параметр Fill_value (по умолчанию: fill_value = None)
Это значение, которое заменяет отсутствующие значения.
Отсутствующие значения или NaN (не число) появляются, когда нет index-columns
комбинаций для values
, которые вы агрегируете.
В DataFrame выше (слева) код области 1112 не имеет агента «b», следовательно, NaN, где должно быть значение комбинации 1112 и «b».
Здесь мы можем использовать fill_value=0
, чтобы заменить NaN на 0.
Вы также можете использовать строковые значения, как в приведенном ниже коде, где мы передаем пустую строку в параметр fill_value
.
параметр dropna (по умолчанию: dropna = True)
При значении True
этот параметр удаляет строки или столбцы, содержащие только отсутствующие значения.
Например, используя DataFrame ниже, предположим, что у нас есть новый agent c
, которому еще не был присвоен код города, и новый area code 1113
без цены и размера.
Если мы хотим, чтобы они отображались в сводной таблице, но не присутствовали в исходной таблице, мы можем выполнить следующие шаги:
- Преобразуйте функции
agent
иarea_code
в категориальные типы данных и укажите все возможные категории.
df['area_code'] = pd.Categorical( df['area_code'], categories=['1111', '1112', '1113']) df['agent'] = pd.Categorical( df['agent'], categories=['a', 'b', 'c'])
- Сведите данные с помощью
dropna=False
, чтобы столбцы и строки, содержащие только отсутствующие значения, не были удалены. Вы также можете использоватьfill_value
здесь.
pd.pivot_table(df, index = 'area_code', columns = 'agent', values = 'price', aggfunc = 'mean', dropna = False)
Параметр «Поля» (по умолчанию: поля = False)
Это отображает агрегированное значение для каждой строки и столбца сводной таблицы. Параметр поля работает, когда результаты сводной таблицы представляют собой числовые значения (значения из aggfunc
функций, таких как sum
, count
, nunique
и т. д.), и одна и та же функция aggfunc
используется для вычисления margin
значений.
Например, в приведенной ниже сводной_таблице мы группируем данные по ‘area_code’
и возвращаем sum
из ‘price’
, а затем группируем по ‘agent’
. Нам также нужны значения margins
, и в этом случае возвращается sum
значений строки и столбца.
pd.pivot_table(df, index = 'area_code', columns = 'agent', values = 'price', aggfunc = 'sum', dropna = False, fill_value = 0, margins = True)
Параметр Margins_name (по умолчанию: margins_name='All')
Это переименовывает имена полей и работает только с margins
, установленным на True.
В приведенном ниже коде мы меняем имена полей на ‘sum_total’
.
Параметр «наблюдаемый» (по умолчанию: наблюдаемый = False)
Когда у вас есть категориальные типы данных, как мы делали ранее, иногда сводная_таблица будет отображать строки и столбцы, содержащие только нулевые значения. Это происходит даже тогда, когда dropna=True
.
При установке observed=True
отображаются только «наблюдаемые» группы. Это экономит память и вычислительную мощность при создании сводных таблиц из больших наборов данных.
Параметр «Сортировка» (по умолчанию: sort = True)
Это сортирует индексы строк и столбцов.
pd.pivot_table(df, index = 'area_code', aggfunc = 'first')
При sort=False
результирующие индексы строк отображаются в исходном порядке, но заголовки столбцов остаются отсортированными.
pd.pivot_table(df, index = ['area_code','agent'], aggfunc = 'first', sort = False)
Заключение
В этой статье мы рассмотрели, как использовать сводную таблицу Pandas и ее параметры. Мы также узнали, что values
всех уникальных комбинаций параметров index
и columns
объединяются в одно значение с помощью функции aggfunc
.
Затем мы увидели, как иерархические столбцы (многоиндексные) получаются в результате передачи index
вместе с несколькими аргументами columns
, values
или aggfunc
. Позже мы объединили и удалили мультииндексные уровни.
Сводная таблица важна для обобщения набора данных. Затем вы можете использовать эту сводку для построения графиков или форматирования и оформления таблицы для презентации.
Найдите блокнот и файлы, использованные в этой статье, здесь, на GitHub.
Надеюсь, вам понравилась статья. Чтобы получать больше таких сообщений всякий раз, когда я публикую новый, подпишитесь здесь. Если вы еще не являетесь участником среды и хотели бы поддержать меня как писателя, перейдите по этой ссылке, и я получу небольшую комиссию. Спасибо за чтение!