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

Pandas如何基于groupby分组结果替换原DataFrame对应列值

实现同分组vote值替换为分组众数的方案

场景说明

你已通过如下代码完成分组聚合,得到每个(ini_num, dep_parl_group)分组对应投票众数的结果表vote_mode:

vote_mode = dataset.groupby(['ini_num','dep_parl_group'])['vote'].agg(lambda x: disambiguated_mode(x)).to_frame()

目标是将原数据集dataset中每条记录的vote值,替换为其所属分组的众数,实现同一分组下所有记录的vote值完全统一。


方案1:groupby + transform 一步实现(推荐)

不需要提前单独生成聚合表vote_mode,直接用transform方法即可返回和原数据集行顺序完全对齐的分组计算结果,直接赋值即可完成替换,不会出现索引匹配错误:

dataset['vote'] = dataset.groupby(['ini_num', 'dep_parl_group'])['vote'].transform(lambda x: disambiguated_mode(x))
  • 优势:代码最简洁,无额外中间表,自动对齐原表行顺序,不会出现匹配错位问题
  • 适用场景:不需要留存单独的分组众数表的情况

方案2:基于已生成的vote_mode表匹配替换

如果你已经提前生成了vote_mode聚合表,可以通过表连接的方式把分组众数匹配回原表完成替换:

# 重置聚合表索引,将分组键从索引转为普通列,同时重命名众数列避免列名冲突
vote_mode_renamed = vote_mode.reset_index().rename(columns={'vote': 'group_mode'})
# 按分组键左连接,将众数匹配到原表每条记录
dataset = dataset.merge(vote_mode_renamed, on=['ini_num', 'dep_parl_group'], how='left')
# 用分组众数覆盖原vote列,删除临时列
dataset['vote'] = dataset['group_mode']
dataset.drop(columns=['group_mode'], inplace=True)

注意:groupby聚合生成的vote_mode默认把ini_num、dep_parl_group设为多层索引,不执行reset_index()直接merge会找不到匹配键报错。


结果校验

替换完成后可以运行如下代码验证结果是否符合预期,返回True即说明所有分组的vote值已统一为分组众数:

is_correct = dataset.groupby(['ini_num', 'dep_parl_group'])['vote'].nunique().eq(1).all()
print(is_correct)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:21:13