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

