Pandas按name分组将指定值替换为对应分组众数的实现方法
按分组众数替换指定无效值的Pandas实现
实现思路
- 先按
name列分组,计算每个分组下value列的众数,建立分组名到众数的映射关系 - 判断
value属于待替换列表的记录,将其值替换为对应分组的众数,非目标值保持原样 - 众数可能存在多值情况,默认取第一个返回的众数即可适配当前示例场景,可按需调整取值规则
完整可运行代码
import pandas as pd # 1. 构造示例数据集 df = pd.DataFrame({ 'year': [2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003], 'name': ['Mick']*4 + ['Jane']*4, 'value': ['a', 'a', 'ab', 'b', 'c', 'c', 'cd', 'd'] }) values_i_do_not_want = ['ab', 'cd'] # 2. 计算每个name分组对应的value众数,生成映射字典 group_mode_map = df.groupby('name')['value'].agg( # 若存在多个并列众数,取第一个,可按需修改取值逻辑 lambda x: x.mode().iloc[0] ).to_dict() # 3. 条件替换:仅替换待替换列表内的值,其余保留原值 # 小数据集写法,逻辑直观 df['value'] = df.apply( lambda row: group_mode_map[row['name']] if row['value'] in values_i_do_not_want else row['value'], axis=1 ) # --- 大数据量优先用向量化写法,性能更高 --- # df['ref_mode'] = df['name'].map(group_mode_map) # df['value'] = df['value'].mask(df['value'].isin(values_i_do_not_want), df['ref_mode']) # df = df.drop(columns='ref_mode')
运行结果验证
执行代码后输出的DataFrame完全匹配预期:
- Mick分组2002年的
ab被替换为分组众数a - Jane分组2002年的
cd被替换为分组众数c - 其余所有非待替换列表内的值均保持不变
内容的提问来源于stack exchange,提问作者loookazs
相关产品推荐
相关产品推荐

