如何对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
相关产品推荐
相关产品推荐

