问题描述
id Revenue Cost qty time
0 A 400 50 2 1
1 A 900 200 8 2
2 A 800 100 8 3
3 B 300 20 1 1
4 B 600 150 4 2
5 B 650 155 4 3
我正在尝试做到这一点:
id Type 1 2 3
0 A Revenue 400 900 800
1 A Cost 50 200 100
2 A qty 2 8 8
3 B Revenue 300 600 650
4 B Cost 20 150 155
5 B qty 1 4 4
时间总是会重复1-3,所以我需要在时间上转置或旋转,专栏为1-3
这是我到目前为止尝试过的:
pd.pivot_table(df,values = ['Revenue','qty','Cost'],index=['id'],columns='time').reset_index()
Revenue qty Cost
1 2 3 1 2 3 1 2 3
在这种情况下,我需要将Revenue,qty和Cost转换为一行,并仅使用1、2、3作为列名。因此,每个“类型”的ID都会重复,但会根据时间1-3将其列出。
解决方法
我们仍然可以进行unstack
和stack
df.set_index(['id','time']).stack().unstack(level=1).reset_index()
Out[24]:
time id level_1 1 2 3
0 A Revenue 400 900 800
1 A Cost 50 200 100
2 A qty 2 8 8
3 B Revenue 300 600 650
4 B Cost 20 150 155
5 B qty 1 4 4
,
(df
.melt(["id","time"])
.pivot(["id","variable"],"time","value")
.reset_index()
.rename_axis(columns=None)
)
id variable 1 2 3
0 A Cost 50 200 100
1 A Revenue 400 900 800
2 A qty 2 8 8
3 B Cost 20 150 155
4 B Revenue 300 600 650
5 B qty 1 4 4