Pandas Pivot: руководство с примерами

Оглавление

Библиотека

Python Pandas является одним из самых популярных инструментов в арсенале исследователя данных. Специалисты по исследованию данных используют Pandas для изучения, очистки и понимания наборов данных.

В предыдущей статье мы рассмотрели как работать с Pandas DataFrame, основной структурой данных в библиотеке Pandas. Если вы впервые знакомитесь с Pandas, эта статья - отличный способ начать работу.

В этой заметке мы узнаем, как изменить форму DataFrames с помощью метода Pivot. Метод Pivot позволяет придать данным различную форму для более удобного анализа.

Мы рассмотрим:

  • Зачем нужно поворачивать данные;
  • Как использовать метод pivot;
  • Когда использовать метод pivot против метода pivot_table;
  • Как использовать метод pivot_table;

Давайте начнем.

Зачем pivot ваши данные

Прежде чем перейти к подробному описанию того, как осуществить поворот, важно знать, почему вы хотите осуществить поворот.

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

Если вы являетесь мастером Excel, который провел много времени в электронных таблицах, то идея разворота может быть для вас простой. Если же нет, то без примера это может быть трудно понять. Давайте посмотрим, как это работает.

В приведенном ниже примере я создам Pandas DataFrame из некоторых данных о торговле акциями, которые я использовал в предыдущих статьях о Pandas.

>>> import pandas as pd
>>> stocks = pd.read_csv('https://gist.githubusercontent.com/alexdebrie/b3f40efc3dd7664df5a20f5eee85e854/raw/ee3e6feccba2464cbbc2e185fb17961c53d2a7f5/stocks.csv')
>>> stocks
          date symbol     open     high      low    close    volume
0   2019-03-01   AMZN  1655.13  1674.26  1651.00  1671.73   4974877
1   2019-03-04   AMZN  1685.00  1709.43  1674.36  1696.17   6167358
2   2019-03-05   AMZN  1702.95  1707.80  1689.01  1692.43   3681522
3   2019-03-06   AMZN  1695.97  1697.75  1668.28  1668.95   3996001
4   2019-03-07   AMZN  1667.37  1669.75  1620.51  1625.95   4957017
5   2019-03-01   AAPL   174.28   175.15   172.89   174.97  25886167
6   2019-03-04   AAPL   175.69   177.75   173.97   175.85  27436203
7   2019-03-05   AAPL   175.94   176.00   174.54   175.53  19737419
8   2019-03-06   AAPL   174.67   175.49   173.94   174.52  20810384
9   2019-03-07   AAPL   173.87   174.44   172.02   172.50  24796374
10  2019-03-01   GOOG  1124.90  1142.97  1124.75  1140.99   1450316
11  2019-03-04   GOOG  1146.99  1158.28  1130.69  1147.80   1446047
12  2019-03-05   GOOG  1150.06  1169.61  1146.19  1162.03   1443174
13  2019-03-06   GOOG  1162.49  1167.57  1155.49  1157.86   1099289
14  2019-03-07   GOOG  1155.72  1156.76  1134.91  1143.30   1166559

Когда мы распечатаем код, то увидим, что данные имеют несколько столбцов, а строки организованы по дате торгов и символу акции.

Такая организация может быть полезна для некоторого анализа, но получить информацию об объеме торгов по датам и символам акций может быть затруднительно. Давайте изменим форму наших данных, чтобы более детально рассмотреть объем.

>>> stocks.pivot(index='symbol', columns='date', values='volume')
date    2019-03-01  2019-03-04  2019-03-05  2019-03-06  2019-03-07
symbol
AAPL      25886167    27436203    19737419    20810384    24796374
AMZN       4974877     6167358     3681522     3996001     4957017
GOOG       1450316     1446047     1443174     1099289     1166559

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

Эта перестраивающая сила pivot значительно облегчает понимание взаимосвязей в ваших наборах данных.

Как использовать панды pivot method

Для использования метода pivot в Pandas необходимо указать три параметра:

  • Index: Какой столбец следует использовать для идентификации и упорядочивания строк по вертикали
  • Columns: Какой столбец следует использовать для создания новых столбцов в нашем переформированном DataFrame. Каждое уникальное значение в указанном здесь столбце будет создавать столбец в нашем новом DataFrame.
  • Values: Какой столбец (столбцы) следует использовать для заполнения значений в ячейках нашего DataFrame.

Давайте рассмотрим их на примере данных о торговле акциями. В приведенном ниже примере я использую pivot для изучения цены закрытия торгов для каждого символа акции в течение нашего торгового окна.

>>> stocks
          date symbol     open     high      low    close    volume
0   2019-03-01   AMZN  1655.13  1674.26  1651.00  1671.73   4974877
1   2019-03-04   AMZN  1685.00  1709.43  1674.36  1696.17   6167358
2   2019-03-05   AMZN  1702.95  1707.80  1689.01  1692.43   3681522
3   2019-03-06   AMZN  1695.97  1697.75  1668.28  1668.95   3996001
4   2019-03-07   AMZN  1667.37  1669.75  1620.51  1625.95   4957017
5   2019-03-01   AAPL   174.28   175.15   172.89   174.97  25886167
6   2019-03-04   AAPL   175.69   177.75   173.97   175.85  27436203
7   2019-03-05   AAPL   175.94   176.00   174.54   175.53  19737419
8   2019-03-06   AAPL   174.67   175.49   173.94   174.52  20810384
9   2019-03-07   AAPL   173.87   174.44   172.02   172.50  24796374
10  2019-03-01   GOOG  1124.90  1142.97  1124.75  1140.99   1450316
11  2019-03-04   GOOG  1146.99  1158.28  1130.69  1147.80   1446047
12  2019-03-05   GOOG  1150.06  1169.61  1146.19  1162.03   1443174
13  2019-03-06   GOOG  1162.49  1167.57  1155.49  1157.86   1099289
14  2019-03-07   GOOG  1155.72  1156.76  1134.91  1143.30   1166559
>>> stocks.pivot(index='symbol', columns='date', values='close')
date    2019-03-01  2019-03-04  2019-03-05  2019-03-06  2019-03-07
symbol
AAPL        174.97      175.85      175.53      174.52      172.50
AMZN       1671.73     1696.17     1692.43     1668.95     1625.95
GOOG       1140.99     1147.80     1162.03     1157.86     1143.30

Сначала я распечатал наш DataFrame, чтобы посмотреть, как он организован по умолчанию. Затем я использую метод pivot для изменения данных.

Обратите внимание, что для параметра index я использовал symbol. В результате каждое уникальное значение для столбца символов - AAPL, AMZN, GOOG - используется в качестве индекса, крайнего левого столбца в нашем DataFrame.

Я использовал date для параметра column. В результате в верхней части нашего DataFrame появилось пять неиндексных столбцов, по одному на каждое уникальное значение в столбце date нашего исходного DataFrame.

Наконец, я использовал close в качестве параметра values. Это указывает, какое значение должно быть помещено в каждый столбец. Меня интересует цена закрытия для каждой акции за все торговые дни, поэтому я использую колонку close.

Обратите внимание, что параметры index и column взаимозаменяемы. Если вы хотите реорганизовать систему так, чтобы даты использовались в качестве индекса, а символы акций были моими колонками, то можно просто поменять местами параметры:

>>> stocks.pivot(index='date', columns='symbol', values='close')
symbol        AAPL     AMZN     GOOG
date
2019-03-01  174.97  1671.73  1140.99
2019-03-04  175.85  1696.17  1147.80
2019-03-05  175.53  1692.43  1162.03
2019-03-06  174.52  1668.95  1157.86
2019-03-07  172.50  1625.95  1143.30

Когда использовать pivot против pivot_table в Pandas

До сих пор мы использовали термин "поворот" только в широком смысле, но на самом деле существует два метода Pandas для поворота. Первый - это метод pivot, который мы рассмотрели в этом разделе. Второй - метод pivot_table, с которым мы познакомимся в следующем разделе.

При выборе метода pivot или pivot_table необходимо задать себе один вопрос:

Будут ли результаты моего pivot иметь более одной записи в любом индексе + столбце?

Если ответ на этот вопрос "да", то вы должны использовать метод pivot_table. Если ответ на этот вопрос "нет", то вы можете использовать метод pivot.

Обратите внимание, что любое использование pivot может быть переключено на pivot_table, но обратное не верно. Если попытаться использовать метод pivot там, где в любой комбинации индекс + столбец будет более одной записи, то возникнет ошибка ValueError.

В следующем разделе мы рассмотрим, как работает метод pivot_table на практике.

Как использовать метод Pandas pivot_table

Для тех, кто знаком с Excel или другими инструментами работы с электронными таблицами, pivot table более привычна как инструмент агрегирования. Разворотные таблицы Pandas используются для группировки похожих столбцов с целью нахождения итоговых, средних или других суммарных показателей.

Эту же функциональность можно реализовать в Pandas с помощью метода pivot_table. Например, представим, что мы хотим найти средний объем торгов для каждого символа акции в нашем DataFrame. Это можно сделать с помощью следующего использования pivot_table:

>>> stocks.pivot_table(index='symbol', values='volume')
            volume
symbol
AAPL    23733309.4
AMZN     4755355.0
GOOG     1321077.0

Как и в случае с pivot, мы указываем индекс, который хотим использовать для наших данных, а также столбец для заполнения значений.

Обратите внимание, что для каждого символа акции в нашем индексе будет пять значений в колонке объема, так как для каждой акции существует пять торговых дней. Метод pivot_table агрегирует эти значения и применяет агрегатную функцию для приведения их к одному значению.

По умолчанию в качестве агрегатной функции используется функция mean из NumPy, но можно передать и собственную агрегатную функцию. Если я хочу объединить свои значения в общую сумму, я могу использовать функцию sum из NumPy:sum

>>> import numpy as np
>>> stocks.pivot_table(index='symbol', values='volume', aggfunc=np.sum)
           volume
symbol
AAPL    118666547
AMZN     23776775
GOOG      6605385

Метод поворотных таблиц становится действительно мощным, если использовать его с MultiIndex, который позволяет иметь иерархии в индексе. Например, представьте, что у вас есть большой набор данных по биржевой торговле, включающий обучающие данные за целый год. С помощью MultiIndex можно создать таблицу pivot, в которой значения будут сгруппированы по символу акции и месяцу, что позволит быстро проследить, как изменился объем торгов и другая статистика по конкретным акциям в зависимости от месяца.

Заключение

В этом посте мы узнали о повороте DataFrames в Pandas с помощью функций pivot и pivot_table. Мы рассмотрели, зачем нужно поворачивать данные, а также показали, как использовать функции pivot и pivot_table.

Вернуться на верх