Pandas Pivot: руководство с примерами
Оглавление
- Почему нужно поворачивать данные
- Как использовать метод Pandas pivot
- Когда использовать pivot против pivot_table в Pandas
- Как использовать метод Pandas pivot_table
- Заключение
Библиотека
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
.