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

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都明显超出边界,未检测到异常值的可能原因如下:

  1. 调用函数时传入的df.new_deaths和你做统计描述的不是同一个数据副本,比如你之前做过过滤、切片操作,数据已经发生了变化
  2. np.percentile默认的分位数插值规则和pandasdescribe()方法的计算规则不一致,你可以在np.percentile参数里添加method='midpoint',对齐pandas的默认分位数计算逻辑
  3. 拼写误差导致调用时传入了其他无异常的列,你输出日志里的列名拼写为new deatths,和实际列名new_deaths不一致,可以核对传入参数是否正确

你可以在函数内临时添加打印q1、q3、floor、ceiling的代码,确认计算出的边界是否和手动计算结果一致,就能快速定位问题。

问题2:UFuncTypeError报错的含义与触发原因

报错含义

该报错翻译为:通用函数(ufunc) multiply 没有匹配输入类型的运算逻辑,输入的两个操作数类型都是长度不超过32的字符串(<U32),无法执行乘法运算返回对应类型的结果

触发原因

你遍历df.columns得到的feature是列名字符串,直接把字符串传给了要求传入数值序列的find_outliers_tukey函数,函数内对字符串计算分位数得到的结果还是字符串类型,执行1.5*iqr乘法运算时就会触发类型不匹配报错。

修复建议

  1. 调用函数时传入列对应的数值序列,把代码改为find_outliers_tukey(df[feature])
  2. 提前过滤非数值列,避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:06:03