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

如何修改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)

代码解释

  1. 分组统计:value_counts()统计每个分组内val的出现次数;
  2. 获取多数值:idxmax()直接拿到出现次数最多的数值(二元值场景下必然是其中一个);
  3. 筛选异常值:找出出现次数为1的数值,这些就是需要替换的目标;
  4. 批量替换: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:30:43