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


101

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


8
pandas具有pandas.isnull():我不确定这是否满足您的需求,因此一些示例数据可能很好。
Marius 2013年

4
@Marius:pandas.isnull()似乎工作正常。我当前处理的唯一数据类型numpy.isnan()是字符串,并pandas.isnull()能很好地处理它。实际上,它似乎可以很好地处理我扔给它的所有任意对象。您是否有任何关注的具体问题?否则,您可能希望将评论作为完整的答案提交,因为这似乎是规范的答案,至少对于熊猫用户而言。
2013年

Answers:


169

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

19

您的类型是真的武断吗?如果您知道它将只是一个int浮点数或字符串,则可以这样做

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

假设它包装在numpy中,它将始终具有dtype,并且只有float和complex可以为NaN


我正在处理许多不同类型的数据。尽管大多数列具有int *或float *数据类型,但其他列也可以是任何对象,尽管到目前为止,我使用的唯一其他类型是字符串。
2013年

python中的字符串没有dtype。您可能需要做type(val) == 'float'
pvarma

4
type(val) == float and np.isnan(val)-为我工作
Danny Cullen

@ user1930402我假设这些是numpy数组,而不是常规的python数组。例如:np.array([“ hello”])[0] .dtype有效,但是[“ hello”] [0] .dtype无效
Hammer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.