125

我的 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,有没有办法优雅而有效地处理这个问题?

4

3 回答 3

198

pandas.isnull()(也在pd.isna()较新的版本中)检查数字和字符串/对象数组中的缺失值。从文档中,它检查:

数值数组中的 NaN,对象数组中的 None/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
于 2013-09-08T23:33:44.187 回答
20

你的类型真的很随意吗?如果你知道它只是一个 int float 或 string 你可以这样做

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

假设它被包裹在 numpy 中,它总是有一个 dtype 并且只有 float 和 complex 可以是 NaN

于 2013-09-08T23:15:16.887 回答
4

我在这里找到了这个绝妙的解决方案,它使用简单的逻辑 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
于 2021-02-19T21:40:59.143 回答