Python中Z-score法去异常值:批量处理函数报错修复求助
问题修复方案
错误原因分析
- 核心报错根源:遍历
df.columns得到的col是列名字符串(比如'MonthlyIncome'),不是DataFrame的列对象,直接调用col.mean()自然会触发「str对象无mean属性」的错误,必须通过df[col]获取列的Series对象后再调用统计方法。 - 变量未定义:批量代码里直接使用
i但没有遍历列的元素,缺少遍历当前列值的循环逻辑。 - 列引用错误:
df.col这种点语法仅适用于固定列名,当列名是变量col时,必须用df[col]来引用对应列。 - 原逻辑瑕疵:原单列代码中每次发现异常值就立刻修改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
相关产品推荐
相关产品推荐

