如何在 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)
假设我有一个像这样的支点:
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)