将熊猫多索引数据框重塑为多列

Posted

技术标签:

【中文标题】将熊猫多索引数据框重塑为多列【英文标题】:Reshaping pandas multi-index dataframe to multi-column 【发布时间】:2019-06-30 18:16:58 【问题描述】:

两天来,我一直在尝试重塑给定的 pandas 数据框。我想将我的多索引数据框转换为多列形式,但使用 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    ...   ...    ...   ...

我正在使用适用于 Windows 64 位的 python 3.7 和 pandas 版本 0.23.4 并且非常感谢任何可以帮助我解决问题的提示和可能的解决方案。

【问题讨论】:

【参考方案1】:

关于 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

注意:同样可以使用 groupby 来完成。由于您需要两个级别的列,因此您需要取消堆叠两次。

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

【讨论】:

厉害,不知道pandas有数据透视表功能!更好的是,您还可以指定聚合值的函数(默认情况下)

以上是关于将熊猫多索引数据框重塑为多列的主要内容,如果未能解决你的问题,请参考以下文章

ValueError 将多索引熊猫数据框转换为 Excel

熊猫:使用数据框的多列作为另一个的索引

如何更改熊猫数据框中多索引的外层索引?

熊猫数据框检查索引是不是存在于多索引中

如何重新索引多索引熊猫数据框?

将函数应用于多索引多列数据帧的 Pythonic 方法是啥?