【python】如何判断nan

以为python的nan是专有的类型,但是JS、C++都有这个类型的,怪写的代码bug太少,没遇到

None 和 nan

type(None)-----------Nonetype
type(Nan)-------------float

判断nan

这里出了7个判断的方法,但实际有效的只有3个,还有半有效的~
后四个方法则是只有np.nan可以判断自己的类型,其他三种没办法自己判断自己。
也就是说:
np.nan is np.nan是True
float(‘nan’) is float(‘nan’) 是False,另外两个也是False
为什么呢?
Nan 全称是Not a Number,是IEEE754标准规定的双精度浮点小数类型的特殊值。所以看d的类型,即使np.nan,返回也是float类型。

import pandas as pd
import numpy as np
import math
from decimal import Decimal
'''由结果看,前两个是万能的'''
'''第三个对精度高的Decimal行不通'''
def isNan_1(a):
    return math.isnan(a)
def isNan_2(a):
    return a != a
def isNan_3(a):
    if(str(a) == 'nan'):
        return True
    else:
        return False
def isNan_4(a):
    return a is float('nan')
def isNan_5(a):
    return a is Decimal('nan')
def isNan_6(a):
    return a is np.nan
def isNan_7(a):
    return a is np.float64('nan')

尝试了四种类型,float(‘nan’) np.float64(‘nan’) Decimal(‘nan’) np.nan
从结果中发现,前两个函数是百分百正确的,而第三种则是对 float 和np.nan有效果,对精度较高的Decimal无效。而我也只能是凑巧找到了该方法。

a = float('nan')
type_str = "float('nan')"
print("%s type is \t \t \t \t %s\n"%(type_str, type(a)))
print("math.isnan(%s)  \t \t %s\n"%(type_str, isNan_1(a)))
print("%s != %s \t \t %s\n"%(type_str, type_str, isNan_2(a)))
print("%s == 'nan' \t \t \t %s\n"%(type_str,isNan_3(a)))
print("%s is float('nan')  \t \t %s\n"%(type_str,isNan_4(a)))
print("%s is Decimal('nan') \t \t %s\n"%(type_str,isNan_5(a)))
print("%s is np.nan \t \t \t %s\n"%(type_str,isNan_6(a)))
print("%s is np.float64('nan')  \t %s\n"%(type_str,isNan_7(a)))
float('nan') type is 	 	      	 <class 'float'>

math.isnan(float('nan'))  	    	 True

float('nan') != float('nan') 	 	 True

float('nan') == 'nan' 	 	    	 True

float('nan') is float('nan')  	 	 False

float('nan') is Decimal('nan') 	 	 False

float('nan') is np.nan 	 	    	 False

float('nan') is np.float64('nan')  	 False
np.float64('nan')  type is 	      	 <class 'numpy.float64'>

math.isnan(np.float64('nan'))  	     	 	 True

np.float64('nan') != np.float64('nan') 	 	 True

np.float64('nan') == 'nan' 	 	        	 True

np.float64('nan') is float('nan')  	 	 	 False

np.float64('nan') is Decimal('nan') 	 	 False

np.float64('nan') is np.nan 	    	 	 False

np.float64('nan') is np.float64('nan')  	 False
Decimal('nan')  type is	 	 	 	 <class 'decimal.Decimal'>

math.isnan(Decimal('nan'))  	 		  	 True

Decimal('nan') != Decimal('nan') 	 	 	 True

Decimal('nan') == 'nan' 	 	 		  	 False

Decimal('nan') is float('nan')  	 	     False

Decimal('nan') is Decimal('nan') 	 	     False

Decimal('nan') is np.nan 	 	 		  	 False

Decimal('nan') is np.float64('nan')  	 	 False
np.nan type is 	 	    	 <class 'float'>

math.isnan(np.nan)  	 	 	 True

np.nan != np.nan 		 	  	 True

np.nan == 'nan' 	 	 	 	 True

np.nan is float('nan')  	 	 False

np.nan is Decimal('nan') 	 	 False

np.nan is np.nan 	 		  	 True

np.nan is np.float64('nan')  	 False
  • 12
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值