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
相关产品推荐
相关产品推荐

