有效地检查 Python / numpy / pandas 中的任意对象是不是为 NaN?

Posted

技术标签:

【中文标题】有效地检查 Python / numpy / pandas 中的任意对象是不是为 NaN?【英文标题】:Efficiently checking if arbitrary object is NaN in Python / numpy / pandas?有效地检查 Python / numpy / pandas 中的任意对象是否为 NaN? 【发布时间】:2013-09-12 10:15:19 【问题描述】:

我的 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 的昂贵包装器之外,还有什么方法可以优雅高效地处理这个问题?

【问题讨论】:

pandaspandas.isnull():我不确定这是否满足您的需求,所以一些示例数据可能很好。 @Marius: pandas.isnull() 似乎工作得很好。我目前处理的唯一破坏numpy.isnan() 的数据类型是字符串,pandas.isnull() 处理得很好。事实上,它似乎可以很好地处理我扔给它的所有任意对象。你有什么特别关心的问题吗?否则,您可能希望将您的评论作为完整的答案提交,因为它似乎是规范的答案,至少对于 pandas 用户而言。 【参考方案1】:

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

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

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

【讨论】:

我正在处理许多不同类型的数据。虽然大多数列都有 int* 或 float* 数据​​类型,但其他列可以是任何对象,尽管到目前为止我使用的唯一其他类型是字符串。 python 中的字符串没有dtype。你可能需要做type(val) == 'float' type(val) == float and np.isnan(val) - 为我工作 @user1930402 我假设这些是 numpy 数组而不是常规的 python 数组。例如: np.array(["hello"])[0].dtype 有效,但 ["hello"][0].dtype 无效 @pnv type(object) 返回类,而不是字符串【参考方案2】:

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

【讨论】:

【参考方案3】:

我在这里找到了这个绝妙的解决方案,它使用简单的逻辑 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

【讨论】:

以上是关于有效地检查 Python / numpy / pandas 中的任意对象是不是为 NaN?的主要内容,如果未能解决你的问题,请参考以下文章

有效地检查一个元素是不是在列表中至少出现 n 次

如何有效地检测 Python 3 中变量的变化?

当 Python 中的输入是大数时,如何有效地在一个范围内找到完美的正方形

如何有效地检查表是不是为空?

有效地检查文本列中是不是存在文本

创建 XML 时如何有效地检查 NSDictionay 键是不是具有值