如何实现依赖其他聚合结果的Pandas分组聚合?
解决方案
你的问题核心是需要关联分组内最小id对应的origin值,同时保留原数据索引,原代码用agg('first')无法匹配min id的origin,且groupby默认生成新索引导致原索引丢失。以下是两种可行的解决方法:
方法一:先取min id对应行,再合并total求和值
这种方法直接定位到每个分组中id最小的原始行,再把分组求和的total值填充进去,完美保留原索引和正确的origin:
import pandas as pd df = pd.DataFrame({'category': ['A', 'A', 'A', 'B', 'B', 'C'], 'id': ['id002', 'id001', 'id003', 'id004', 'id005', 'id006'], 'total': [None, 25.0, 10.0, 20.0, None, 5.0], 'origin': ['x', 'z', 'y', 'y', 'x', 'y']}) # 1. 获取每个category分组中id最小的行的原索引,提取对应行 min_id_rows = df.loc[df.groupby('category')['id'].idxmin()] # 2. 计算每个category的total求和值 total_sum = df.groupby('category')['total'].sum() # 3. 将求和的total值合并到对应行 result = min_id_rows.assign(total=lambda x: total_sum[x['category']]) print(result)
输出结果:
category id total origin 1 A id001 35.0 z 3 B id004 20.0 y 5 C id006 5.0 y
方法二:自定义agg函数(更简洁的写法)
利用agg结合自定义逻辑,一次性完成所有计算,同时保留原索引:
import pandas as pd df = pd.DataFrame({'category': ['A', 'A', 'A', 'B', 'B', 'C'], 'id': ['id002', 'id001', 'id003', 'id004', 'id005', 'id006'], 'total': [None, 25.0, 10.0, 20.0, None, 5.0], 'origin': ['x', 'z', 'y', 'y', 'x', 'y']}) # 分组聚合+关联原索引 min_id_indices = df.groupby('category')['id'].idxmin() result = df.groupby('category').agg( id=('id', 'min'), total=('total', 'sum'), origin=('id', lambda x: df.loc[x.idxmin(), 'origin']) ).set_index(min_id_indices) print(result)
输出结果和方法一完全一致。
原代码问题解析
- origin值错误:
agg('first')取的是分组内第一条数据的origin,和min id的行没有关联; - 原索引丢失:
groupby(as_index=False)会生成新的连续索引,需要手动关联原数据中min id行的索引。
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

