熊猫枢轴?数据透视表?熔化?堆放还是堆放?

问题描述

我有一个看起来像这样的数据框:

       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将其列出。

解决方法

我们仍然可以进行unstackstack

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
,

另一种方法,在熊猫1.1.0上使用meltpivot

(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