为什么〜pd.isnull()返回-2?

时间:2019-04-15 17:53:43

标签: python

我正在做一些快速测试来处理缺失值,并遇到了这种奇怪的行为。当查看~pd.isnull(np.nan)时,我希望它返回False,但返回-2。为什么会这样?

2 个答案:

答案 0 :(得分:2)

您的困惑是有根据的,因为 scalar 的奇怪结果与“反转”逻辑数组时看到的结果不一致:

stat($qfn)
   or die("Can't stat \"$qfn\": $!\n");

if    (-f _) { say "\"$qfn\" is a plain file."; }
elsif (-d _) { say "\"$qfn\" is a directory."; }
elsif (-l _) { say "\"$qfn\" is a symbolic link."; }
elsif (-p _) { say "\"$qfn\" is a named pipe."; }
elsif (-S _) { say "\"$qfn\" is a socket."; }
elsif (-b _) { say "\"$qfn\" is a block device."; }
elsif (-c _) { say "\"$qfn\" is a character device."; }
else         { say "\"$qfn\" is of unknown type."; }  # Shouldn't happen on unix systems.

这里有一些奇怪的事情。请注意:

>>> pd.isnull([np.nan])
array([ True])
>>> ~pd.isnull([np.nan])
array([False])

因此,将numpy和pandas排除在外,实际上是在问为什么:

>>> pd.isnull(np.nan)
True

发生这种情况是因为>>> ~True -2 bool的子类:

int

表达式>>> issubclass(bool, int) True >>> True == 1 True 挂接到数据模型type(x).__invert__中。现在,~x没有实现bool,因此它退回到了第一个超类,即__invert__

int

对于two's complement>>> int.__invert__(True) -2 本质上是在计算~xdocs实际上就是这样定义的。

不幸的是,-(x+1)以更明智的方式覆盖bool并不容易,即__invert__返回与~b相同的结果,而仍然保持向后兼容性,确保布尔整数。您最终会遇到一个令人烦恼的特殊情况,其中not bx == y

答案 1 :(得分:0)

这是因为您使用了算术的位求反运算符,而不是逻辑求反。