我正在尝试使用一堆年列并将它们取消透视成一列。
输入是这样的:
Country 1990 1991
Canada 10 20
Scotland 100 200
我想要的是这样的
Country Year Value
Canada 1990 10
Canada 1991 20
Scotland 1990 100
Scotland 1991 200
有没有简单的方法可以做到这一点?我觉得我应该能够与大熊猫一起做到这一点,但我做不到。
我想要做的真正的转换更加复杂。以上只是我思考过程中的一步。
完整的问题如下。可以一步完成,还是必须进行多次转换?
Country Measure 1990 1991
Canada M1 10 20
Canada M2 0.1 0.2
Scotland M1 100 200
Scotland M2 1 2
我需要这个:
Country Year M1 M2
Canada 1990 10 0.1
Canada 1991 20 0.2
Scotland 1990 100 1
Scotland 1991 200 2
我尝试了pivot
和stack
的各种组合,但这不是我所需要的。
答案 0 :(得分:1)
尝试melt
和pivot_table
df1 = (df.melt(['Country','Measure'], var_name='Year')
.pivot_table(index=['Country', 'Year'], columns='Measure', values='value')
.reset_index())
Out[321]:
Measure Country Year M1 M2
0 Canada 1990 10.0 0.1
1 Canada 1991 20.0 0.2
2 Scotland 1990 100.0 1.0
3 Scotland 1991 200.0 2.0
答案 1 :(得分:0)
在步骤:
df.set_index(['Country','Measure']).stack().unstack(1).reset_index()
输出:
Measure Country level_1 M1 M2
0 Canada 1990 10.0 0.1
1 Canada 1991 20.0 0.2
2 Scotland 1990 100.0 1.0
3 Scotland 1991 200.0 2.0
关于第一个问题。
df.melt('Country')
输出:
Country variable value
0 Canada 1990 10
1 Scotland 1990 100
2 Canada 1991 20
3 Scotland 1991 200
答案 2 :(得分:0)
这是melt:
new_df=df.melt(id_vars='Country',var_name='Year',value_name='M1').sort_values('M1')
new_df['M2']=new_df['M1']/100
print(new_df)
Country Year M1 M2
0 Canada 1990 10 0.1
2 Canada 1991 20 0.2
1 Scotland 1990 100 1.0
3 Scotland 1991 200 2.0
使用的数据框
print(df)
Country 1990 1991
0 Canada 10 20
1 Scotland 100 200