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

Pandas分组后指定列应用聚合函数其余列取首个值的实现问题

问题根因

你代码失效的核心原因是:agg()方法传入lambda时,接收的参数x是分组后的普通Series对象,不是SeriesGroupBy对象:

  • mean()是Series原生支持的统计方法,对任意Series调用都能正常返回均值
  • 而first()是SeriesGroupBy专属的分组取首行方法,普通Series的first()方法仅适用于时间索引场景,用于取指定时间长度的前序数据,非时间索引下调用无法得到预期的分组首个值。

解决方案1:直接修改现有lambda逻辑

把else分支的x.first()替换为x.iloc[0]即可,iloc[0]会直接取该分组Series的第一个元素,符合你的需求:

df = df.groupby('id').agg(lambda x : x.count() if x.name in ['var1','var2'] else x.iloc[0]).reset_index()

解决方案2:动态生成聚合字典(更推荐)

提前构造聚合规则映射表,Pandas处理时不需要逐列做逻辑判断,性能更优,尤其适合列数较多的场景:

# 生成聚合规则:指定列用count,其余列用GroupBy原生支持的first聚合函数
agg_rules = {col: 'count' if col in ['var1', 'var2'] else 'first' for col in df.columns if col != 'id'}
# 应用分组聚合,reset_index将id从索引转回普通列,和原代码输出结构保持一致
df = df.groupby('id').agg(**agg_rules).reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:36:01