Python 如何检查列表中是否存在np.NaN和/或None
Python 如何检查列表中是否存在np.NaN和/或None,python,numpy,Python,Numpy,None被视为假条件。但是当转换为bool时,np.NaN被视为True any([np.nan, np.NaN, None]) #True 我明白,可以使用np.isnan()捕获它。如果我的数据包含np.NaN、None、np.NaN的组合,那么如果存在这些组合,我如何找到它 有没有更简单的方法找到它们中的一个 编辑: 预期产出: func([np.nan, np.NaN, None, 2]) #True func([np.nan, np.NaN, None,'']) #False 您可
None
被视为假条件。但是当转换为bool
时,np.NaN
被视为True
any([np.nan, np.NaN, None])
#True
我明白,可以使用np.isnan()
捕获它。如果我的数据包含np.NaN
、None
、np.NaN
的组合,那么如果存在这些组合,我如何找到它
有没有更简单的方法找到它们中的一个
编辑:
预期产出:
func([np.nan, np.NaN, None, 2])
#True
func([np.nan, np.NaN, None,''])
#False
您可以定义自己的自定义函数来检查数字是否在有效输入集中,例如:
def isvalid(number):
if number is None or np.isnan(number):
return False
else:
return True
any([isvalid(x) for x in data])
编辑:我知道您可能想检查其中是否有无效的,您可以简单地否定isvalid结果以实现这一点。另一种方法是将任何nan转换为有效数字,在本例中为
0.0
:
In[91]:
any([np.nan_to_num(x) for x in [np.nan, np.NaN, None]])
Out[91]: False
将NaN
转换为0.0
:
In[92]:
[np.nan_to_num(x) for x in [np.nan, np.NaN, None]]
Out[92]: [0.0, 0.0, None]
编辑
这还将处理更新的样本数据:
In[93]:
any([np.nan_to_num(x) for x in [np.nan, np.NaN, None,'']])
Out[93]: False
还有一个窍门:
arr = [np.nan, None, np.nan]
[i == i if i is not None else False for i in arr]
输出:
[False, False, False]
False
注意:np.nan==np.nan
返回False
因此,
arr = [np.nan, None, np.nan, '']
any([i == i if i is not None and i != '' else False for i in arr])
输出:
[False, False, False]
False
以及
输出:
True
时间:
%timeit any([np.nan_to_num(x) for x in arr])
每个回路241µs±22µs(7次运行的平均±标准偏差,每个1000个回路)
每个回路20.5µs±1.95µs(7次运行的平均值±标准偏差,每个100000个回路)
每个回路2.44µs±137 ns(7次运行的平均值±标准偏差,每个100000个回路)
以下方法将None、各种nan和偶数nan视为字符串:
>>将numpy作为np导入
>>>[np.nan,np.nan,None,'nan','nan']]中x的任意([~np.isnan(np.float_uux)))
假的
Pandas有一个notna
函数,可用于None和各种NaN(但不是作为字符串的NaN)
>>将熊猫作为pd导入
>>>任意([np.nan,np.nan,None,pd.NA,pd.NaT]]中x的[pd.notna(x)])
假的
但这两种方法都不适用于空字符串
'
相关和可能的重复:要知道将[np.nan,np.nan,None]
识别为False的最佳方法是什么,但对于最后一部分,这是一个重复,您在这里尝试测试什么?如果存在NaN
或None
?您可以使用np.isin(您的数组[np.NaN,np.NaN,None])
返回布尔值,而不是真/假,例如不返回(数字为None或np.isnan(数字))
我喜欢使用NaN\u to\u num
来处理None、空字符串和NaN。谢谢你的帮助。感谢信息有用+1
%timeit any([i == i if i is not None and i != '' else False for i in arr])