Все, что вы всегда хотели знать о pandas Pivot, но боялись спросить.

Pandas pivot - важный инструмент каждого специалиста по данным. Некоторые используют его ежедневно, а другие избегают, потому что это кажется сложным. Я был в последней группе довольно долгое время. После того, как я потратил время и провел небольшое исследование, я почувствовал, что трачу много времени на написание ненужного кода. К моему удивлению, я уже знал основные строительные блоки панд. Все проще, чем может показаться.

Вот несколько ссылок, которые могут вас заинтересовать:

- Complete your Python analyses 10x faster with Mito [Product]
- Free skill tests for Data Scientists & ML Engineers [Test]
- All New Self-Driving Car Engineer Nanodegree [Course]

Хотели бы вы прочитать больше таких статей? Если да, вы можете поддержать меня, нажав на любую ссылку выше. Некоторые из них являются партнерскими ссылками, но вам не нужно ничего покупать.

Что такое сводная таблица?

Сводная таблица - это таблица статистики, которая суммирует данные более обширной таблицы. На практике сводная таблица вычисляет статистику по разбивке значений. Для первого столбца он отображает значения в виде строк, а для второго столбца - в виде столбцов.

Давайте посмотрим на пример сводной таблицы, которая вычисляет суммарную статистику с разбивкой по фруктам и покупателям:

Как я могу повернуть таблицу в пандах?

В Pandas есть функция pivot_table, которая применяет сводку к DataFrame. Он также поддерживает aggfunc, которая определяет статистику для расчета при повороте (по умолчанию aggfunc - это np.mean, который вычисляет среднее значение). Я использую сумму в примере ниже.

Давайте определим DataFrame и применим функцию pivot_table.

df = pd.DataFrame(
    {
        "fruit": ["apple", "orange", "apple", "avocado", "orange"],
        "customer": ["ben", "alice", "ben", "josh", "steve"],
        "quantity": [1, 2, 3, 1, 2],
    }
)

Я хотел бы разбить фрукты в строках (указать индекс) и клиентов в столбцах (указать столбцы). Для каждой записи я хотел бы вычислить сумму количеств. Результат такой же, как в таблице выше.

df.pivot_table(index="fruit", columns="customer", values="quantity", aggfunc=np.sum)

Почему при повороте я получаю ошибку значения?

Наиболее вероятная причина в том, что вы использовали функцию pivot вместо pivot_table. Это меня много раз сбивало с толку. Функция Pandas pivot - менее мощная функция, которая выполняет поворот без агрегации, которая может обрабатывать нечисловые данные.

Ошибка «ValueError: индекс содержит повторяющиеся записи, не может изменить форму» произошла из-за наличия повторяющихся записей в вашем DataFrame. Если бы я повернул DataFrame выше, я бы получил ту же ошибку, что и яблоко и Бен дублируются, а функция поворота не агрегирует.

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

df.set_index(["fruit", "customer"])["quantity"].unstack()

Какие операции на самом деле происходят при повороте?

Поначалу поворот может показаться вам непонятной концепцией. Но что, если бы я сказал вам, что вы использовали его все время - по крайней мере, команды, которые лежат в основе поворота в пандах. Давайте посмотрим на команду ниже:

df.groupby(['fruit', 'customer']).quantity.sum().unstack()

Вы когда-нибудь использовали функцию groupby в пандах? А как насчет команды суммы? Да? Я так и думал. Вывод приведенной выше команды такой же, как и для pivot_table.

Я не использовал unstack много раз, но в основном он распаковывает мультииндекс в столбцы, как на изображении ниже.

Как я могу установить отсутствующие значения на 0?

Больше ни слова! pivot_table имеет аргумент fill_value для замены отсутствующих значений. По умолчанию - Нет. Давай попробуем.

df.pivot_table(index="fruit", columns="customer", values="quantity", aggfunc=np.sum, fill_value=0)

Могу ли я рассчитывать несколько статистических данных одновременно?

Аргумент aggfunc функции pivot_table принимает список функций. Давайте попробуем с суммой и средним значением.

df.pivot_table(index="fruit", columns="customer", values="quantity", aggfunc=[np.sum, np.mean], fill_value=0)

Могу ли я агрегировать несколько значений одновременно?

Вы можете! Подобно аргументу aggfunc, аргумент values ​​принимает список имен столбцов. Давайте добавим столбец цен в DataFrame.

df['price'] = [0.1, 0.2, 0.1, 0.4, 0.15]

Теперь, когда у нас есть два столбца со значениями, применим функцию pivot_table:

df.pivot_table(index="fruit", columns="customer", values=["quantity", "price"], aggfunc=np.mean, fill_value=0)

Могу ли я сделать еще более детальную разбивку по строкам / столбцам?

Ответ - снова да. И индекс аргументов, и столбец принимают списки. Давайте добавим начало столбца фруктов в DataFrame.

df['origin'] = ['italy', 'spain', 'spain', 'mexico', 'portugal']

Теперь давайте разберем фрукты и происхождение по строкам и клиентов по столбцам.

df.pivot_table(
    index=["fruit", "origin"],
    columns=["customer"],
    values=["quantity"],
    fill_value=0,
    aggfunc=np.mean,
)

Работает как часы!

Прежде чем ты уйдешь

Следуйте за мной в Twitter, где я регулярно пишу твиты о Data Science и машинном обучении.