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

Pandas分组后同时定义多聚合函数(含自定义)的实现方法

Pandas Groupby多列自定义聚合解决方案

需求说明

需要在一次groupby/agg操作中完成三个任务:

  • 计算is_orange与is_non_orange两列的分组总和,保存为新列
  • 计算is_orange占两列总和的比例,保存为新列
  • 计算melons列的分组总和

原始数据

import pandas as pd

df = pd.DataFrame({'location': ['backyard', 'store', 'bank', 'backyard', 'backyard', 'bank', 'store'],
                   'is_orange': [1, 1, 0, 0, 1, 0, 1],
                   'is_non_orange': [0, 0, 1, 1, 0, 1, 0],
                   'melons':     [73, 81, 94, 174, 23, 71, 65]})

问题分析

你之前的尝试直接引用原DataFrame的列计算,会对整个数据集操作而非分组后的子数据集,因此无法得到正确结果。需要针对每个分组的子DataFrame编写自定义聚合逻辑。

解决方案

使用groupby.agg结合lambda函数,直接对分组后的子DataFrame进行多列运算:

result = df.groupby('location').agg(
    total_orange_non_orange=lambda g: g['is_orange'].sum() + g['is_non_orange'].sum(),
    percentage_oranges=lambda g: g['is_orange'].sum() / (g['is_orange'].sum() + g['is_non_orange'].sum()),
    sum_melons=('melons', 'sum')
).round(2)

print(result)

输出结果

total_orange_non_orange  percentage_oranges  sum_melons
location                                                            
backyard                           3                0.66         270
bank                               2                0.00         165
store                              2                1.00         146

补充说明

  • lambda函数的参数g代表每个分组后的子DataFrame,可直接调用子df的列进行聚合计算
  • 对于简单求和操作(如sum_melons),直接使用内置的'sum'字符串参数更高效
  • 使用.round(2)对比例列进行小数位数格式化,匹配期望输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:57:42