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

如何实现依赖其他聚合结果的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:13:13