如何修改pandas分组中仅出现一次的异常值?
pandas分组替换单次出现的二元值异常值
需求说明
给定的DataFrame按name字段分组,val为二元取值(示例中是1和2)。需要将每组中仅出现一次的val替换为该组的多数值(即出现次数更多的那个值):
- 分组A中1仅出现1次,替换为2;
- 分组B中2仅出现1次,替换为1;
- 分组C中1和2各出现2次,保持原样。
解决方案
可以通过groupby结合transform实现,把替换逻辑封装成函数后应用到每个分组:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'name': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C'], 'val': [1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2] }) def fix_single_outliers(series): # 统计分组内各值的出现次数 val_counts = series.value_counts() # 获取分组的多数值(众数) mode_val = val_counts.idxmax() # 筛选出仅出现一次的值 single_occur_vals = val_counts[val_counts == 1].index # 替换异常值 return series.replace(single_occur_vals, mode_val) # 按name分组,应用替换逻辑 df['val'] = df.groupby('name')['val'].transform(fix_single_outliers) print(df)
代码解释
- 分组统计:
value_counts()统计每个分组内val的出现次数; - 获取多数值:
idxmax()直接拿到出现次数最多的数值(二元值场景下必然是其中一个); - 筛选异常值:找出出现次数为1的数值,这些就是需要替换的目标;
- 批量替换:
replace()把异常值替换为分组的多数值,transform会自动将处理后的结果映射回原DataFrame的对应行。
运行结果
最终输出的DataFrame符合预期:
name val 0 A 2 1 A 2 2 A 2 3 A 2 4 B 1 5 B 1 6 B 1 7 B 1 8 C 1 9 C 1 10 C 2 11 C 2
内容的提问来源于stack exchange,提问作者jfang
相关产品推荐
相关产品推荐

