在 Python/numpy/anda 中有效地检查任意对象是否为 NaN?

我的 numpy 数组使用 np.nan来指定缺失的值。在迭代数据集时,我需要检测这些缺失的值,并以特殊的方式处理它们。

我很天真地使用了 numpy.isnan(val),它工作得很好,除非 val不在 numpy.isnan()支持的类型子集中。例如,字符串字段中可能出现缺失数据,在这种情况下,我得到:

>>> np.isnan('some_string')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Not implemented for this type

除了编写一个昂贵的包装器来捕获异常并返回 False之外,还有什么方法可以优雅而有效地处理这个问题吗?

212407 次浏览

你喜欢的类型真的很武断吗?如果你知道它只是一个整型浮点数或字符串,你可以这样做

 if val.dtype == float and np.isnan(val):

假设它是用 numpy 包装的,那么它总是有一个 dtype,并且只有 float 和 plex 可以是 NaN

pandas.isnull()(在较新的版本中也是 pd.isna())检查数值和字符串/对象数组中缺少的值。从文档中可以看出:

数值数组中的 NaN,对象数组中的 Nothing/NaN

举个简单的例子:

import pandas as pd
import numpy as np
s = pd.Series(['apple', np.nan, 'banana'])
pd.isnull(s)
Out[9]:
0    False
1     True
2    False
dtype: bool

使用 numpy.nan来表示缺失值的想法是 pandas引入的,这就是为什么 pandas有工具来处理它的原因。

日期时间也是如此(如果使用 pd.NaT,则不需要指定 dtype)

In [24]: s = Series([Timestamp('20130101'),np.nan,Timestamp('20130102 9:30')],dtype='M8[ns]')


In [25]: s
Out[25]:
0   2013-01-01 00:00:00
1                   NaT
2   2013-01-02 09:30:00
dtype: datetime64[ns]``


In [26]: pd.isnull(s)
Out[26]:
0    False
1     True
2    False
dtype: bool

我在这里找到了这个绝妙的解决方案,它使用了简单的逻辑 NAN! = NAN。 Https://www.codespeedy.com/check-if-a-given-string-is-nan-in-python/

使用上面的示例,您可以简单地执行以下操作。这应该适用于不同类型的对象,因为它只是利用了 NAN 不等于 NAN 这一事实。

 import numpy as np
s = pd.Series(['apple', np.nan, 'banana'])
s.apply(lambda x: x!=x)
out[252]
0    False
1     True
2    False
dtype: bool