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

如何编写Pandas自定义函数移除异常值?报错修复求助

修复移除DataFrame列异常值的自定义函数问题

我来帮你搞定这个报错问题!你遇到的"marks未定义"错误,根源在于自定义函数的参数设计和内部列名引用都写死了,没有真正利用传入的列名变量来处理数据,另外原函数还有一个隐藏问题:过滤操作没有生效,返回的还是原始DataFrame。

错误原因分析

你原来的函数定义是:

def outlier (data,age):
    Q1 = data.age.quantile(0.25)
    Q3 = data.age.quantile(0.75)
    IQR = Q3 - Q1
    data.loc[~((data.age < (Q1 - 1.5 * IQR)) | (data.age > (Q3 + 1.5 * IQR))),]
    return data

这里有两个关键问题:

  1. 第二个参数命名为age,但函数内部全程硬编码使用data.age,完全没用到传入的参数值;当你调用outlier(data,marks)时,Python会把marks当成变量查找,而你并没有定义这个变量,所以直接报错。
  2. data.loc[...]只是执行了过滤操作,但没有把过滤后的结果赋值给新变量或者覆盖原变量,最后返回的还是原始的data,等于过滤操作白做了。

修复后的自定义函数

我们需要把列名改成可传入的变量参数,并且正确返回过滤后的DataFrame:

def remove_outliers(data, col_name):
    # 计算分位数和IQR
    Q1 = data[col_name].quantile(0.25)
    Q3 = data[col_name].quantile(0.75)
    IQR = Q3 - Q1
    # 计算异常值边界
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    # 过滤掉异常值,返回新的DataFrame
    cleaned_data = data.loc[~((data[col_name] < lower_bound) | (data[col_name] > upper_bound))]
    return cleaned_data

调用示例

现在你可以正常传入列名字符串来处理对应列的异常值了:

# 处理age列
cleaned_age_data = remove_outliers(data, "age")
print("处理age列后的结果:")
print(cleaned_age_data)

# 处理marks列
cleaned_marks_data = remove_outliers(data, "marks")
print("\n处理marks列后的结果:")
print(cleaned_marks_data)

验证结果

比如处理age列时,原始数据中的505和-43会被判定为异常值并移除;处理marks列时,422会被移除,完全符合1.5±IQR的异常值判定规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:24:03