[英]How to check for float('nan') in Python?
在我正在處理的一些數據中,我遇到了float
類型的數據,這些數據用 'nan' 填充,即float('nan')
。
但是檢查它不能按預期工作:
float('nan') == float('nan')
>> False
您可以使用math.isnan
進行檢查,但由於我的數據還包含字符串(例如:'nan',還有其他用戶輸入),所以不太方便:
import math
math.isnan(float('nan'))
>> True
math.isnan('nan')
>> TypeError: must be real number, not str
在理想的世界中,我想檢查一個值是否在所有可能的 NaN 值的列表中,例如:
import numpy as np
if x in ['nan', np.nan, ... ]:
# Do something
pass
現在的問題是:我怎樣才能在使用這種方法的同時檢查float('nan')
值? 為什么等於float('nan') == float('nan')
False
這很行人,而且有點難看,但為什么不做以下事情呢?
import math
import numpy as np
if math.isnan(x) or x in ['nan', np.nan, ... ]:
# Do something
pass
我想推薦一個尤達表達式,但還沒有完全解決。
如果您想清掃地毯下的所有東西,請將其放入 lambda 或 function 中。
從https://stackoverflow.com/a/64090763/1021819 開始,您可以嘗試讓迭代器以懶惰的方式評估任何內容。 那么問題是,如果第一個條件都沒有計算為True
,那么math.isnan()
調用被執行並且仍然可以拋出TypeError
。 如果你懶惰地評估,你可以通過對str
的類型檢查來保護math.isnan()
調用:
fn_list_to_check=[
lambda x: x in ['nan', np.nan, ... ],
lambda x: not isinstance(x, str),
lambda x: math.isnan(x)
]
if any(f(x) for f in fn_list_to_check):
# Do something
pass
請注意,any 中沒有方列表括號,即any()
而不是any([])
(誰知道?)。
我認為它非常出色但同樣丑陋 - 選擇你的毒葯。
對於問題的第二部分(為什么float('nan') != float('nan')
),請參閱
為什么不用另一個float
轉換來包裝你傳遞給math.isnan
的任何東西呢? 如果它已經是一個浮點數(即float('nan')
),您只需進行“冗余”調用:
import math
def is_nan(value):
return math.isnan(float(value))
這似乎給了你預期的結果:
>>> is_nan(float('nan'))
True
>>> is_nan('nan')
True
>>> is_nan(np.nan)
True
您可以像這樣檢查 NaN 值,
def isNaN(num):
return num!= num
NaN 表示為“非數字”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.