Numpy/Pandas清除方式来检查特定值是否为NaN

Att*_*nen 6 python numpy pandas

如何检查给定值是否为NaN?

例如if (a == np.NaN)(不起作用)

在您投票之前,请注意:

  • Numpy的isnan方法会抛出像string这样的数据类型的错误
  • Pandas docs仅提供删除包含NaN的行的方法,或者检查DataFrame是否包含NaN的方法.我问的是检查特定值是否为NaN.
  • 相关的Stackoverflow问题和Google搜索结果似乎是关于检查"如果任何值是NaN"或"DataFrame中的哪个值"

必须有一个干净的方法来检查给定的值是否为NaN?

piR*_*red 8

大熊猫有isnull,notnull,isna,和notna

这些函数适用于数组或标量.


建立

a = np.array([[1, np.nan],
              [None, '2']])
Run Code Online (Sandbox Code Playgroud)

熊猫的功能

pd.isna(a)
# same as
# pd.isnull(a)

array([[False,  True],
       [ True, False]])
Run Code Online (Sandbox Code Playgroud)
pd.notnull(a)
# same as
# pd.notna(a)

array([[ True, False],
       [False,  True]])
Run Code Online (Sandbox Code Playgroud)

DataFrame(或Series)方法

b = pd.DataFrame(a)
Run Code Online (Sandbox Code Playgroud)
b.isnull()
# same as
# b.isna()

       0      1
0  False   True
1   True  False
Run Code Online (Sandbox Code Playgroud)
b.notna()
# same as
# b.notnull()

       0      1
0   True  False
1  False   True
Run Code Online (Sandbox Code Playgroud)


EdC*_*ica 8

您可以使用NaN!= 的inate属性NaN

所以如果是的话a == a会回来的FalseaNaN

这甚至可以用于字符串

例:

In[52]:
s = pd.Series([1, np.NaN, '', 1.0])
s

Out[52]: 
0      1
1    NaN
2       
3      1
dtype: object


for val in s:
    print(val==val)
True
False
True
True
Run Code Online (Sandbox Code Playgroud)

这可以以矢量化的方式完成:

In[54]:
s==s

Out[54]: 
0     True
1    False
2     True
3     True
dtype: bool
Run Code Online (Sandbox Code Playgroud)

但你仍然可以isnull在整个系列中使用该方法:

In[55]:
s.isnull()

Out[55]: 
0    False
1     True
2    False
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

UPDATE

正如@piRSquared指出,如果你比较None==None这将返回True,但pd.isnull将返回True所以这取决于你是否要正确对待None作为NaN你仍然可以使用==比较或者pd.isnull如果你想治疗NoneNaN