堆叠,旋转或其他?

时间:2019-10-21 18:38:56

标签: python pandas

我正在尝试使用一堆年列并将它们取消透视成一列。

输入是这样的:

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

我尝试了pivotstack的各种组合,但这不是我所需要的。

3 个答案:

答案 0 :(得分:1)

尝试meltpivot_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