如何编写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
这里有两个关键问题:
- 第二个参数命名为
age,但函数内部全程硬编码使用data.age,完全没用到传入的参数值;当你调用outlier(data,marks)时,Python会把marks当成变量查找,而你并没有定义这个变量,所以直接报错。 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
相关产品推荐
相关产品推荐

