Как сделать сводную таблицу со значениями в строках по индексу - PullRequest
1 голос
/ 19 июня 2019

Контекст и исследования

В настоящее время я экспериментирую с pivot_table из библиотеки панд и ищу способ составить таблицу каким-то определенным образом. Идея состоит в том, чтобы отобразить таблицу со значениями в строках в соответствии с индексом, а в столбцах - с другой переменной.

После просмотра нескольких ответов на сайте , связанных с группировкой в ​​pandas.pivot_table, однако я не нашел такого, который мог бы решить эту проблему пока что.

Код и пример

Поскольку показывать лучше, чем рассказывать, я предоставляю вам небольшой фрагмент кода, чтобы показать, что мне удалось сделать.

import pandas as pd

df = pd.DataFrame(
  {
    "Year": [2018, 2018, 2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2019, 2019, 2019], 
    "Month": [4, 5, 6 , 7, 8, 9, 10, 4, 5, 6 , 7, 8, 9, 10],
    "Apples": [3, 5, 1, 2, 5, 6, 6, 8, 9, 9, 1, 8, 6, 4],
    "Temperature": [8.6, 13.7, 16.5, 18.5, 18.0, 13.5, 8.7, 9.2 , 14.2, 15.5, 20.1, 18.6, 12.8, 8.7]
  } 
)

pivoted_data = pd.pivot_table(df, index=['Month'], columns=['Year'], values=['Apples', 'Temperature']).transpose()

Результат pivoted_table :

Month              4     5     6     7     8     9    10
            Year                                        
Apples      2018  3.0   5.0   1.0   2.0   5.0   6.0  6.0
            2019  8.0   9.0   9.0   1.0   8.0   6.0  4.0
Temperature 2018  8.6  13.7  16.5  18.5  18.0  13.5  8.7
            2019  9.2  14.2  15.5  20.1  18.6  12.8  8.7

Лучшая попытка - использовать метод .transpose () для фреймов данных и визуализировать таблицу, как указано выше, однако это не совсем то, что я ищу.

Ожидаемый результат

Я хочу представить данные следующим образом:

     Month          4     5     6     7     8     9    10
Year                                                     
2018 Temperature   8.6  13.7  16.5  18.5  18.0  13.5  8.7
     Apples        3.0   5.0   1.0   2.0   5.0   6.0  6.0
2019 Temperature   8.0   9.0   9.0   1.0   8.0   6.0  4.0
     Apples        9.2  14.2  15.5  20.1  18.6  12.8  8.7

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

Мне не удалось найти хорошее решение для текущей проблемы. Кто-нибудь знает, как таким образом отобразить этот небольшой набор данных?

1 Ответ

4 голосов
/ 19 июня 2019

Используйте DataFrame.swaplevel с DataFrame.sort_index, также другое решение для транспонирования - DataFrame.T (меньше ввода):

pivoted_data = (pd.pivot_table(df, 
                               index='Month',
                               columns='Year', 
                               values=['Apples', 'Temperature'])
                  .T
                  .swaplevel(1, 0)
                  .sort_index())

print (pivoted_data)
Month              4     5     6     7     8     9    10
Year                                                    
2018 Apples       3.0   5.0   1.0   2.0   5.0   6.0  6.0
     Temperature  8.6  13.7  16.5  18.5  18.0  13.5  8.7
2019 Apples       8.0   9.0   9.0   1.0   8.0   6.0  4.0
     Temperature  9.2  14.2  15.5  20.1  18.6  12.8  8.7
...