pd.notnull 的奇怪空检查行为

  • 本文关键字:notnull pd python pandas null
  • 更新时间 :
  • 英文 :


这本质上是对我在这里回答内容的重述。

在尝试解决此问题时,我遇到了一些奇怪的行为,使用pd.notnull.

考虑

x = ('A4', nan)

我想检查这些项目中哪些是空的。直接使用np.isnan会抛出 TypeError(但我已经想出了如何解决这个问题(。

使用pd.notnull不起作用。

>>> pd.notnull(x)
True

它将元组视为单个值(而不是值的可迭代对象(。此外,将其转换为列表然后进行测试也会给出不正确的答案。

>>> pd.notnull(list(x))
array([ True,  True])

由于第二个值是nan,我正在寻找的结果应该是[True, False]。当您预转换为系列时,它最终会起作用:

>>> pd.Series(x).notnull() 
0     True
1    False
dtype: bool

因此,解决方案是将其串联化,然后测试值。

同样,另一个(诚然是迂回的(解决方案是预转换为objectdtype numpy 数组,pd.notnullnp.isnan将直接工作:

>>> pd.notnull(np.array(x, dtype=object))
Out[151]: array([True,  False])

我想pd.notnull直接将x转换为幕后的字符串数组,将 NaN 渲染为字符串"nan",因此它不再是"null"值。

pd.notnull在这里做同样的事情吗?还是在幕后还有其他我应该注意的事情?

笔记

In [156]: pd.__version__
Out[156]: '0.22.0'

下面是与此行为相关的问题:https://github.com/pandas-dev/pandas/issues/20675。

简而言之,如果传递给notnull的参数是list类型,则在内部使用np.asarray方法将其转换为np.array。出现此错误是因为,如果未指定dtype,numpy 会将np.nan转换为string(pd.isnull无法将其识别为 null 值(:

a = ['A4', np.nan]
np.asarray(a)
# array(['A4', 'nan'], dtype='<U3')

此问题已在版本 0.23.0 中修复,方法是使用dtype=object调用np.asarray

相关内容

  • 没有找到相关文章

最新更新