pandas 使用explode()作为聚合函数[重复]

vbopmzt1  于 2023-09-29  发布在  其他
关注(0)|答案(1)|浏览(129)

此问题已在此处有答案

How can I pivot a dataframe?(5个答案)
2天前关闭。
如何在pd.pivot_table()中复制explode索引行?

import pandas as pd

df = pd.DataFrame({
    "group": [1,2,2,3,1,2,3], 
    "panel": [1,1,1,1,2,2,2],
    "value": [0,1,2,3,4,5,6]
})

pd.pivot_table(df, index="group", columns="panel", aggfunc="explode")

但是"explode"不是有效的聚合函数。我想有这个结果

value   
panel     1  2
group         
1         0  4
2         1  5
2         2  NaN
3         3  6
72qzrwbm

72qzrwbm1#

你不应该聚合然后爆炸,你需要的是在pivot之前删除重复索引:

out = (df.assign(idx2=df.groupby(['group', 'panel']).cumcount())
         .pivot(index=['group', 'idx2'], columns='panel')
      )

输出量:

value     
panel          1    2
group idx2           
1     0      0.0  4.0
2     0      1.0  5.0
      1      2.0  NaN
3     0      3.0  6.0

要摆脱droplevel的重复数据消除级别,请执行以下操作:

out = (df.assign(idx2=df.groupby(['group', 'panel']).cumcount())
         .pivot(index=['group', 'idx2'], columns='panel')
         .droplevel(1)
      )

输出量:

value     
panel     1    2
group           
1       0.0  4.0
2       1.0  5.0
2       2.0  NaN
3       3.0  6.0

中间体:

# df.assign(idx2=df.groupby(['group', 'panel']).cumcount())

   group  panel  value  idx2
0      1      1      0     0
1      2      1      1     0
2      2      1      2     1  # will create a new row
3      3      1      3     0
4      1      2      4     0
5      2      2      5     0
6      3      2      6     0

相关问题