Pandas Сводная таблица с 3 уровнями мультииндексации - PullRequest
2 голосов
/ 07 февраля 2020

Я пытался всеми возможными способами взять этот фрейм данных

import pandas as pd

dataDict = {'State': ['Idaho', 'Wyoming', 'Montana', 'Idaho', 'Idaho', 'Wyoming', 'Montana', 'Idaho', 'Idaho', 'Wyoming', 'Montana', 'Idaho'],
            'City': ['Boise', 'Jackson', 'Missoula', 'Sandpoint', 'Boise', 'Jackson', 'Missoula', 'Sandpoint', 'Boise', 'Jackson', 'Missoula', 'Sandpoint'],
            'Years': [2010, 2010, 2010, 2010, 2011, 2011, 2011, 2011, 2012, 2012, 2012, 2012],
            'PizzaOrdered' : [3000, 50, 1000, 78, 3250, 75, 1250, 82, 4000, 98, 4100, 92],
            'TacosOrdered' : [5000, 65, 1900, 88, 5780, 78, 2128, 90, 6125, 87, 5999, 95]
            }
testData = pd.DataFrame(data=dataDict)

enter image description here

и преобразовать его в этот

enter image description here

Я пробовал сводки, groupby, set_index, стекирование, развертывание, и я могу приблизиться, но не тихо к этому примеру, который я привел ниже

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Вам нужно melt до unstack

df_final = (testData.melt(['State', 'City', 'Years'], var_name='Ordered')
                    .set_index(['State', 'City', 'Ordered', 'Years'])['value']
                    .unstack())

Out[54]:
Years                           2010  2011  2012
State   City      Ordered
Idaho   Boise     PizzaOrdered  3000  3250  4000
                  TacosOrdered  5000  5780  6125
        Sandpoint PizzaOrdered    78    82    92
                  TacosOrdered    88    90    95
Montana Missoula  PizzaOrdered  1000  1250  4100
                  TacosOrdered  1900  2128  5999
Wyoming Jackson   PizzaOrdered    50    75    98
                  TacosOrdered    65    78    87
1 голос
/ 07 февраля 2020

Вы можете сделать pivot_table, затем 'stack:

testData.pivot_table(index=['State','City'], columns='Years').stack(0)

Выход:

Years                           2010  2011  2012
State   City                                    
Idaho   Boise     PizzaOrdered  3000  3250  4000
                  TacosOrdered  5000  5780  6125
        Sandpoint PizzaOrdered    78    82    92
                  TacosOrdered    88    90    95
Montana Missoula  PizzaOrdered  1000  1250  4100
                  TacosOrdered  1900  2128  5999
Wyoming Jackson   PizzaOrdered    50    75    98
                  TacosOrdered    65    78    87
...