Python用IQR检测DataFrame异常值无结果与UFuncTypeError问题
Pandas 异常值检测问题解答
问题1:Tukey异常值检测函数未识别到new_deaths列明显极端值的原因
我们先基于你给出的new_deaths列统计值手动计算Tukey检测边界:
- Q1(25分位数)= 0
- Q3(75分位数)= 18
- IQR = Q3 - Q1 = 18
- 下界 = Q1 - 1.5*IQR = -27
- 上界 = Q3 + 1.5*IQR = 45
你给出的列最小值-1918、最大值18000都明显超出边界,未检测到异常值的可能原因如下:
- 调用函数时传入的
df.new_deaths和你做统计描述的不是同一个数据副本,比如你之前做过过滤、切片操作,数据已经发生了变化 np.percentile默认的分位数插值规则和pandasdescribe()方法的计算规则不一致,你可以在np.percentile参数里添加method='midpoint',对齐pandas的默认分位数计算逻辑- 拼写误差导致调用时传入了其他无异常的列,你输出日志里的列名拼写为
new deatths,和实际列名new_deaths不一致,可以核对传入参数是否正确
你可以在函数内临时添加打印q1、q3、floor、ceiling的代码,确认计算出的边界是否和手动计算结果一致,就能快速定位问题。
问题2:UFuncTypeError报错的含义与触发原因
报错含义
该报错翻译为:通用函数(ufunc) multiply 没有匹配输入类型的运算逻辑,输入的两个操作数类型都是长度不超过32的字符串(<U32),无法执行乘法运算返回对应类型的结果
触发原因
你遍历df.columns得到的feature是列名字符串,直接把字符串传给了要求传入数值序列的find_outliers_tukey函数,函数内对字符串计算分位数得到的结果还是字符串类型,执行1.5*iqr乘法运算时就会触发类型不匹配报错。
修复建议
- 调用函数时传入列对应的数值序列,把代码改为
find_outliers_tukey(df[feature]) - 提前过滤非数值列,避免
date、location这类非数值列参与计算,遍历代码可以修改为:
# 仅遍历数值列 for feature in df.select_dtypes(include='number').columns: tukey_indices, tukey_values = find_outliers_tukey(df[feature]) print(f"Outliers in {feature} are {tukey_values} \n")
内容的提问来源于stack exchange,提问作者Bruce Murdock
相关产品推荐
相关产品推荐

