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

pandas使用zscore高亮异常值 如何避免标注NaN值

解决方案

你的代码中NaN被高亮的核心原因是NaN填充逻辑写反了:

  • 你当前将NaN填充为np.Inf,Inf < 1.5的判断结果为False,会触发where语句的第二个参数(橙色高亮样式)
  • 如果你希望NaN不被高亮,需要让它对应的mask值为True,同时你原代码中replace(0, np.Inf)的逻辑会把正常的接近0的zscore替换为无穷大,导致无意义的误判,建议直接删除。

修改后的完整代码

import numpy as np
import pandas as pd
from scipy import stats # 注意补充导入stats模块

# 示例数据构造
array=[[750.0, 1.1e-09, 'daljk', 6.0],
       [890.0, 1e-09, 'djfh', 8.0],
       [1720.0, 1e-09, 'dkhf', 4.0],
       [999.0, 1e-09, 'dkafh', 10.0],
       [890.0, 1e-09, 'dkajfh', 0.0005],
       [909.0, 1e-09, 'jkdafh', 6.0],
       [1002.0, 1e-09, 'dlfakh', np.nan],
       [990.0, 1e-09, 'ldkj', 3.0],
       [0.0001, 1e-09, 'dlkfj', 10.0]]
df = pd.DataFrame(array, columns = ['A','B','C','D'])

def highlight_outliers(x):
    color ='orange'
    # 提取数值列
    c=x.select_dtypes([np.number]).columns
    df2=pd.DataFrame(x,columns=c)
    # 计算z-score,缺失值直接保留NaN
    df2=df2.apply(stats.zscore, nan_policy='omit').abs()
    # 构造mask:z-score小于1.5 或 原始值为NaN的位置为True(不高亮)
    mask = (df2 < 1.5) | df2.isna()
    # 生成样式表
    df1=pd.DataFrame('',index=x.index, columns=c)
    df1 = df1.where(mask, f'background-color:{color}').reindex(columns=x.columns, fill_value='')
    return df1

df_styled=df.style.apply(highlight_outliers, axis=None)
df_styled

修改说明

  • 删掉了冗余的pd.to_numeric转换、错误的fillna(np.Inf)和replace(0, np.Inf)逻辑,直接基于z-score结果判断
  • 新增df2.isna()判断,只要z-score结果为NaN(对应原数据的缺失值),就会被标记为不需要高亮
  • 逻辑更简洁清晰,也不会出现无意义的误判情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:00