You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对pandas groupby对象中的两个聚合列执行除法运算

报错原因

你之前的写法错误是因为将np.sum和np.size两个函数对象直接做除法,Python不支持函数之间的除法运算,且你需要的是两个不同列的聚合结果相除,不是对同一列做聚合运算,因此不能在agg的参数字典里直接按这个方式定义新列。

可行解决方案

方案1(最推荐,简单易读):先聚合再计算新列

先通过groupby得到总购买量和总支出两个聚合结果,再直接对两列做除法得到平均值:

# 分组聚合得到两个统计列
grouped_df = df.groupby('bucket', as_index=False).agg(
    receiver_policy = ('receiver_policy', 'sum'),
    total_paid = ('total_paid', 'sum')
)
# 计算每份保单平均支出,保留2位小数
grouped_df['avg_paid_per_policy'] = (grouped_df['total_paid'] / grouped_df['receiver_policy']).round(2)

如果需要处理总购买量为0的除零异常,可以改成如下写法:

grouped_df['avg_paid_per_policy'] = grouped_df.apply(
    lambda row: round(row['total_paid'] / row['receiver_policy'], 2) if row['receiver_policy'] != 0 else 0,
    axis=1
)

方案2:单步完成计算

可以通过groupby.apply自定义分组计算逻辑,一步得到最终结果:

def calc_group_metric(group):
    total_policy = group['receiver_policy'].sum()
    total_paid = group['total_paid'].sum()
    avg_paid = round(total_paid / total_policy, 2) if total_policy != 0 else 0
    return pd.Series([total_policy, total_paid, avg_paid], 
                     index=['receiver_policy', 'total_paid', 'avg_paid_per_policy'])

grouped_df = df.groupby('bucket').apply(calc_group_metric).reset_index()

两种方案都可以得到你期望的输出结果。


内容的提问来源于stack exchange,提问作者Nick Taylor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:48:00