我已经尝试了两天来重塑给定的熊猫数据框。我想将多索引数据框转换为多列形式,但是使用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 ... ... ... ...
我将pandas版本0.23.4用于Windows 64位的python 3.7并非常感谢任何可以帮助我解决问题的技巧和可能的解决方案。
答案 0 :(得分:3)
关于融化和以SO为中心有许多好的答案。在示例df中,sum列为字符串类型。将其转换为int并使用ivot_table。 ivot和pivot_table之间的主要区别在于,当索引包含重复的条目时,您需要将pivot_table与某些聚合函数一起使用。如果您不传递任何功能,则默认值为均值。
1 * digit1 * digit2
注意:使用groupby可以完成相同的操作。由于您需要两个级别的列,因此需要将其拆栈两次。
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