我正在做一些快速测试来处理缺失值,并遇到了这种奇怪的行为。当查看~pd.isnull(np.nan)
时,我希望它返回False,但返回-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
本质上是在计算~x
。 docs实际上就是这样定义的。
不幸的是,-(x+1)
以更明智的方式覆盖bool
并不容易,即__invert__
返回与~b
相同的结果,而仍然保持向后兼容性,确保布尔是整数。您最终会遇到一个令人烦恼的特殊情况,其中not b
但x == y
。
答案 1 :(得分:0)
这是因为您使用了算术的位求反运算符,而不是逻辑求反。