Pandas 枢轴? pivot_table?熔化?堆叠还是拆开?

Pandas pivot? pivot_table? melt? stack or unstack?

我有一个如下所示的数据框:

       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()

但这只会让一个非常长 table 将所有东西并排放置 vs 像这样堆叠:

   Revenue                   qty                Cost
       1     2     3         1     2     3         1    2     3

在那种情况下,我需要将 Revenue、qty 和 Cost 转换成一行,并只使用 1、2、3 作为列名。因此,每个 'type' 的 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

替代方案,在 Pandas 1.1.0 上使用 melt and pivot :

(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