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

Python中Z-score法去异常值:批量处理函数报错修复求助

问题修复方案

错误原因分析

  1. 核心报错根源:遍历df.columns得到的col是列名字符串(比如'MonthlyIncome'),不是DataFrame的列对象,直接调用col.mean()自然会触发「str对象无mean属性」的错误,必须通过df[col]获取列的Series对象后再调用统计方法。
  2. 变量未定义:批量代码里直接使用i但没有遍历列的元素,缺少遍历当前列值的循环逻辑。
  3. 列引用错误:df.col这种点语法仅适用于固定列名,当列名是变量col时,必须用df[col]来引用对应列。
  4. 原逻辑瑕疵:原单列代码中每次发现异常值就立刻修改df,会导致后续遍历的元素数量动态变化,应该先收集所有异常值,最后一次性过滤。

修复后的批量处理代码

def z_score_elimination(df):
    # 复制原数据,避免修改原始数据集
    cleaned_df = df.copy()
    threshold = 3
    for col in cleaned_df.columns:
        # 判断当前列是否为数值类型
        if cleaned_df[col].dtype in ['float64', 'int64']:
            col_mean = cleaned_df[col].mean()
            col_std = cleaned_df[col].std()
            outlier = []
            # 遍历当前列的每个值计算Z-score
            for i in cleaned_df[col]:
                z = (i - col_mean) / col_std
                if abs(z) >= threshold:  # 过滤正负双向异常值,仅需正向则去掉abs()
                    outlier.append(i)
            # 一次性过滤当前列的所有异常值
            cleaned_df = cleaned_df[~cleaned_df[col].isin(outlier)]
    return cleaned_df

# 调用函数获取清洗后的数据
df_cleaned = z_score_elimination(df)

额外优化说明

  • 新增abs(z)逻辑,同时过滤Z-score大于3和小于-3的异常值,若只需过滤正向异常值,删除abs()即可。
  • 先复制原数据集,避免修改原始数据,方便后续对比验证。
  • 将阈值定义移到循环外,避免重复定义冗余代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:45:34