【问题标题】:How to add calculated fields in pandas pivot table如何在熊猫数据透视表中添加计算字段
【发布时间】:2021-12-08 20:05:19
【问题描述】:

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

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 部分放在数据透视表中。但是,我想知道是否有更简单的方法来实现这一点。我尝试了以下方法,但没有奏效:

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

【问题讨论】:

  • 请添加您预期的输出数据框
  • 抱歉,这是数据透视格式。我不确定如何输入预期的输出。

标签: python pandas pivot pivot-table calculated-field


【解决方案1】:

在枢轴之前应用这些转换:

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)

【讨论】:

  • 谢谢,它生成了所需的输出。但是,你能解释一下df.eval() 是做什么的吗?
  • 它返回一个新的数据框,应用了任意操作。在这种情况下,也可以使用 assign ,但是使用 eval 您可以只使用列名,而不必引用 df 3 次。
  • 如果您点赞,您能否使用结果输出的屏幕截图编辑您的帖子。将来也更容易让其他人看到。谢谢!
【解决方案2】:

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

【讨论】:

  • 我认为这不是 OP 想要的,这是 sum(Value2)/sum(Value3)...
  • @QuangHoang。谢谢。这是df.groupby('Col_A').apply(lambda x: sum(x['Value2']) / sum(x['Value3')))的结果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多