直方图异常值处理求助:仅移除负2倍标准差区域失败
问题分析与解决方案
首先得指出你代码里的两个关键问题:
- 逻辑偏差:你用
.abs() < 2*x.std()会同时把大于均值+2倍标准差和小于均值-2倍标准差的行都过滤掉,但你只想要移除负方向的部分,这就导致误删了正方向的正常数据 - 操作无效:你筛选后的结果没有赋值回
df,所以原数据根本没被修改,最后导出的还是原始数据!
接下来给你针对性的解决方案,假设你要处理的是数据中的某一列(比如直方图对应的数值列,你需要把target_col替换成实际列名,比如'value'):
步骤1:读取数据并计算关键统计量
import pandas as pd import numpy as np # 读取原始数据 df = pd.read_csv('D:\\Project\\database\\3-Last\\LastCombineHalf.csv') # 指定要处理的目标列(替换成你实际的列名) target_col = '你的目标列名' # 计算该列的均值和2倍标准差下限 mean_val = df[target_col].mean() std_val = df[target_col].std() lower_bound = mean_val - 2 * std_val
步骤2:移除低于负2倍标准差的行
这一步只保留大于等于lower_bound的行,不会碰正方向的数据:
df_filtered = df[df[target_col] >= lower_bound]
步骤3:移除紧邻0的峰值
这里需要你自定义“紧邻0”的范围(比如我设的是±0.2,你可以根据直方图的实际峰值宽度调整),排除这个区间内的行:
# 自定义0附近的阈值,比如-0.2到0.2之间的数值都移除 zero_threshold = 0.2 df_filtered = df_filtered[~((df_filtered[target_col] > -zero_threshold) & (df_filtered[target_col] < zero_threshold))]
步骤4:保存处理后的数据
df_filtered.to_csv('D:\\Project\\database\\3-Last\\Removal.csv', index=False)
额外说明
- 如果你的数据有多列需要处理,可以把步骤2-3改成对每列单独处理,但通常直方图对应的是单一数值列,所以针对单列处理更精准
- 如果你不确定目标列名,可以用
df.columns查看所有列名,找到你要处理的那列
内容的提问来源于stack exchange,提问作者AliY
相关产品推荐
相关产品推荐

