如何在 pandas pivot table 中添加计算字段

How to add calculated fields in pandas pivot table

假设我有一个像这样的支点:

import pandas as pd

d = {'Col_A': [1,2,3,3,3,4,9,9,10,11], 
     'Col_B': ['A','K','E','E','H','A','J','A','L','A'],
     'Value1':[648,654,234,873,248,45,67,94,180,120],
     'Value2':[180,120,35,654,789,34,567,21,235,83],
     'Value3':[567,21,235,83,248,45,67,94,180,120]
    }

df = pd.DataFrame(data=d)
df_pvt = pd.pivot_table(df,values=['Value1'], index='Col_A', columns='Col_B', aggfunc=np.sum).fillna(0)
df_pvt

我想使用“Value2/Value3”在数据透视表的右侧添加一个计算字段。此计算字段还应显示 Col_B 个类别。一种方法是在数据透视表中添加 Value2 和 Value3,然后再进行除法。然后,我可以将那些 Value 2 和 Value 3 部分放在 pivot 中。但是,我想知道是否有更简单的方法来实现这一目标。我试过以下方法,但没有用:

pd.pivot_table(df,values=['Value1','Value2'/'Value3'], index='Col_A', columns=['Col_B','val2/val3'], aggfunc=np.sum).fillna(0)

IIUC,在

之后使用assign
out = df.pivot_table('Value1', 'Col_A', 'Col_B', aggfunc=np.sum).fillna(0) \
        .assign(Value4=df.groupby('Col_A')
                         .apply(lambda x: sum(x['Value2']) / sum(x['Value3'])))
print(out)

# Output:
Col_B      A       E      H     J      K      L    Value4
Col_A                                                    
1      648.0     0.0    0.0   0.0    0.0    0.0  0.317460
2        0.0     0.0    0.0   0.0  654.0    0.0  5.714286
3        0.0  1107.0  248.0   0.0    0.0    0.0  2.611307
4       45.0     0.0    0.0   0.0    0.0    0.0  0.755556
9       94.0     0.0    0.0  67.0    0.0    0.0  3.652174
10       0.0     0.0    0.0   0.0    0.0  180.0  1.305556
11     120.0     0.0    0.0   0.0    0.0    0.0  0.691667

在数据透视之前应用这些转换:

df = df.groupby(['Col_A', 'Col_B']).sum()
df = df.eval('V23 = Value2 / Value3')[['Value1', 'V23']]

然后应用枢轴并清理:

df.reset_index().pivot(index='Col_A', columns='Col_B').fillna(0)

更新: 事实上,您可以将最后一行替换为:

df.unstack(fill_value=0)