0

0

如何检测数据中的异常数值(NaN、None、无穷大等)

花韻仙語

花韻仙語

发布时间:2026-01-03 21:18:09

|

677人浏览过

|

来源于php中文网

原创

如何检测数据中的异常数值(NaN、None、无穷大等)

本文介绍在数据管道验证中高效识别异常数值(如 nan、none、inf/-inf)的专业方法,涵盖 python 原生与 numpy 双方案,强调 `math.isfinite()` 的核心作用,并指出常见误区与最佳实践。

在构建健壮的数据处理流水线时,仅依赖数值范围校验(如 x ∈ [-10, 10])无法捕获语义非法值——例如 float('nan')、float('inf')、None 或非数字类型(如字符串 'missing')。这些值虽可能通过范围检查(如 nan > 10 返回 False),但参与后续计算将导致静默错误或崩溃。因此,语义合法性验证必须先于范围验证

✅ 推荐方案:使用 math.isfinite()

Python 标准库的 math.isfinite(x) 是最简洁、准确的判断函数:它同时排除 NaN、+inf 和 -inf,且要求 x 为合法数字类型(int/float)。注意:它不接受 None 或字符串,因此需前置类型检查。

import math

def is_good_number(x) -> bool:
    """判断单个值是否为合法有限数(排除 NaN、Inf、None、str 等)"""
    return isinstance(x, (int, float)) and not isinstance(x, bool) and math.isfinite(x)

# 测试用例
test_cases = [1.5, -42, 0, float('nan'), float('inf'), float('-inf'), None, "123", True, False]
for x in test_cases:
    print(f"{repr(x):>12} → {is_good_number(x)}")

输出:

         1.5 → True
        -42 → True
         0 → True
     nan → False
     inf → False
    -inf → False
    None → False
     '123' → False
      True → False   # bool 是 int 子类,需显式排除
     False → False
⚠️ 关键注意:bool 在 Python 中是 int 的子类(isinstance(True, int) == True),但业务中通常不视为“数字”。因此建议显式排除 bool 类型,避免误判。

? 批量校验:高效检查整个数据集

对列表、数组或 Pandas Series 进行批量验证时,推荐以下方式:

自由画布
自由画布

百度文库和百度网盘联合开发的AI创作工具类智能体

下载

纯 Python(小数据集):

def all_good_numbers(data) -> bool:
    return all(is_good_number(x) for x in data)

data = [1.0, -3.14, 0, 999]
print(all_good_numbers(data))  # True

NumPy 加速(大数据集):

import numpy as np

def all_good_numbers_np(arr) -> bool:
    arr = np.asarray(arr)
    # 先转为浮点,再用 isnan/isinf;注意:None 会转为 nan
    if arr.dtype == object:
        # 对 object 数组,先逐元素检查类型和有限性
        return all(is_good_number(x) for x in arr.flat)
    return np.all(np.isfinite(arr))

# 示例
arr = np.array([1.0, 2.5, -np.inf, 0.0])
print(all_good_numbers_np(arr))  # False

❌ 常见误区与替代方案辨析

  • 不要用 x == x 检测 NaN:虽然 nan != nan 成立,但该方式无法区分 None 或字符串,且可读性差;
  • 避免 np.isnan(x) 单独使用:它对非数字类型(如 None、字符串)抛出 TypeError,需额外 try-except;
  • 慎用范围检查替代:-10
  • Pandas 用户注意:pd.isna(x) 可统一检测 NaN、None、pd.NaT,但不识别 inf,需组合 np.isfinite() 使用:
    import pandas as pd
    s = pd.Series([1, np.nan, np.inf, None])
    valid_mask = ~pd.isna(s) & np.isfinite(s)  # 正确:同时排除 NaN/None/Inf

✅ 总结:三步验证法(生产推荐)

  1. 类型安全:isinstance(x, (int, float)) and not isinstance(x, bool)
  2. 数学合法性:math.isfinite(x)(一揽子排除 NaN/Inf/-Inf)
  3. 业务范围校验(可选):min_val

将这三步封装为可复用的验证器,即可为数据管道筑牢第一道质量防线。记住:“好数字”的定义首先是“能参与数学运算而不崩溃”,其次才是“符合业务逻辑范围”。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

730

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

631

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

749

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1238

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.08.11

从零到实战:Python 编程系统入门专题
从零到实战:Python 编程系统入门专题

本专题面向零编程基础及初学者,系统讲解 Python 编程语言的核心知识与实战技巧。内容涵盖 Python 基础语法、数据结构、函数与模块、常用标准库、简单算法思维,以及真实应用场景下的小项目实战。通过循序渐进的学习路径,帮助读者快速建立编程思维,掌握 Python 在数据处理、自动化脚本及日常开发中的实际应用能力,为后续深入学习 Web 开发、数据分析或人工智能打下坚实基础。

2

2026.01.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号