有效地检查 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
的昂贵包装器之外,还有什么方法可以优雅高效地处理这个问题?
【问题讨论】:
pandas
有pandas.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?的主要内容,如果未能解决你的问题,请参考以下文章