将 Pandas 多级索引数据框重塑为多列

4

我将尝试重塑给定的pandas dataframe两天了。我想将我的多索引dataframe转换为多列形式,但是使用pd.stack()、pd.unstack()、pd.melt()等方法都失败了。

给出一个通用的多索引dataframe如下:

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    ...   ...    ...   ...

我正在使用Python 3.7 64位版本,pandas版本为0.23.4,希望能得到一些有用的提示和可能的解决方案,以帮助我解决问题。

1个回答

4

在SO上有许多关于melt和pivot的好答案。在您的样本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

注意:可以使用groupby完成相同的操作。由于你需要两个级别的列,所以需要执行两次unstack操作。

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

1
太棒了,我不知道pandas有一个透视表功能!更好的是,你还可以指定聚合值的函数(默认为平均值)。 - gebbissimo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接