Преобразование мультииндексного фрейма данных pandas в мультиколонку - PullRequest
0 голосов
/ 06 февраля 2019

Я пытался изменить форму данных панд в течение двух дней.Я хотел бы преобразовать мой многоиндексный фрейм данных в многостолбцовую форму, но сильно потерпел неудачу с помощью pd.stack (), pd.unstack (), pd.melt (), ...

У меня естьуниверсальный мультииндексный фрейм данных, заданный как:

import pandas

df = pandas.DataFrame({'Scenario' : ['Scen1', 'Scen1', 'Scen1', 'Scen1', 
                                     'Scen1', 'Scen1', 'Scen2','Scen2',
                                     'Scen2', 'Scen2','Scen2','Scen2'],
                                     'Tech' : ['x', 'y', 'z', 'x', 'y', 'z', 
                                               'x', 'y', 'z', 'x', 'y', 'z'],
                                     'Year' : ['2010', '2010', '2010', 
                                               '2015', '2015', '2015',
                                               '2010', '2010', '2010', 
                                               '2015', '2015', '2015'],
                                     'Sum' : ['1', '2', '3', '4', 
                                              '5', '6', '7', '8', 
                                              '9', '10', '11', '12']})

df.set_index(['Scenario', 'Tech'], inplace=True)
print(df)

                   Sum  Year                                                                                                 
Scenario Tech                                                                                                           
Scen1    x      1  2010                                                                                                 
         y      2  2010                                                                                                 
         z      3  2010                                                                                                 
         x      4  2015                                                                                                 
         y      5  2015                                                                                                 
         z      6  2015                                                                                                 
Scen2    x      7  2010                                                                                                 
         y      8  2010                                                                                                 
         z      9  2010                                                                                                 
         x     10  2015                                                                                                 
         y     11  2015                                                                                                 
         z     12  2015   

Однако я хотел бы преобразовать его в следующую форму:

              2010         2015         
    Tech   Scen1 Scen2  Scen1 Scen2  
       x    ...   ...    ...   ... 
       y    ...   ...    ...   ...
       z    ...   ...    ...   ...

IAM с использованием Python 3.7 для Windows 64bit сpandas версии 0.23.4 и был бы очень признателен за любые советы и возможные решения, которые помогут мне справиться с моими проблемами.

1 Ответ

0 голосов
/ 06 февраля 2019

Есть много хороших ответов о плавлении и развороте на SO.В вашем примере df столбец sum имеет строковый тип.Преобразуйте его в int и используйте pivot_table.Основное различие между pivot и pivot_table заключается в том, что когда ваш индекс содержит дублированные записи, вам нужно использовать pivot_table с какой-либо статистической функцией.Если вы не передаете какую-либо функцию, по умолчанию используется среднее значение.

df['Sum'] = df['Sum'].astype(int)
df.pivot_table(index = 'Tech', columns = ['Year', 'Scenario'], values = 'Sum')



Year        2010            2015
Scenario    Scen1   Scen2   Scen1   Scen2
Tech                
x           1       7       4       10
y           2       8       5       11
z           3       9       6       12

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

df.groupby(['Tech','Scenario','Year'])['Sum'].mean().unstack().unstack()
...