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

