【问题标题】:Weird null checking behaviour by pd.notnullpd.notnull 奇怪的空值检查行为
【发布时间】:2018-06-26 15:14:18
【问题描述】:

这实质上是对我的answer here 内容的重新散列。

我在尝试使用pd.notnull 解决this question 时遇到了一些奇怪的行为。

考虑

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

因此,解决方案是对其进行系列化,然后测试这些值。

与此类似,另一个(诚然是迂回的)解决方案是预转换为 object dtype 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'

【问题讨论】:

  • 你使用什么版本的pandas?在 v. 23.0 pd.notnull(list(x)) 返回正确结果:array([ True, False])
  • @GrigoriyMikhalkin 0.22。如果这个问题在 0.23 上不存在,那么它肯定是一个已修复的错误。很有趣。
  • pandas 0.23.1 - x = ('A4', np.nan) print(pd.notnull(list(x))) 测试并返回[ True False]
  • @coldspeed 似乎是与此行为相关的问题:github.com/pandas-dev/pandas/issues/20675
  • @GrigoriyMikhalkin 完美。这就是答案。谢谢。

标签: python pandas null


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2012-12-23
    • 2014-06-20
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多