【发布时间】: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.notnull 或 np.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.0pd.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 完美。这就是答案。谢谢。