【发布时间】:2017-10-11 01:39:33
【问题描述】:
我想知道为什么 python pandas / numpy 不实现具有 true、false 和 NA 的 3 值逻辑(所谓的 Łukasiewicz 逻辑)(就像 R 那样)。我读过 (https://www.oreilly.com/learning/handling-missing-data) 这在一定程度上是因为 pandas 使用的基本数据类型比 R 多得多。但是,我并不完全清楚为什么在这种情况下不可避免地会出现这种带有缺失值的逻辑运算的奇怪行为。
示例。
import numpy as np
np.nan and False # so far so good, we have False
np.nan or False # again, good, we have nan
False and np.nan # False, good
False or np.nan # give nan, so again, it is correct
np.nan and True # weird, this gives True, while it should give nan
True and np.nan # nan, so it is correct, but switching order should not affect the result
np.nan or True # gives nan, which is not correct, should be True
True or np.nan # True so it is correct, again switching the arguments changes the result
因此,该示例表明在比较 np.nan 和 True 值时会发生一些非常奇怪的事情。那么这里发生了什么?
编辑。
感谢 cmets,现在我看到 np.nan 被认为是“真实”的价值。那么任何人都可以解释这究竟是什么意思以及这种方法背后的基本原理是什么?
【问题讨论】:
-
Pandas 2.0 有很多变化,包括如何处理非浮点类型的空值。
-
@aryamccarthy 上面的内容不会随着
pandas2.0 而改变。这是基本的 -
为了记录,很少有语言区分真、假和第三个“NA”值。通常,强类型意味着只有特殊常量具有布尔含义,或者如果许多对象具有布尔含义,它们最终都会被视为真或假。具有 NA 值的 R 是不寻常的;通用编程语言几乎从来没有这样的价值(你可以编写自己的逻辑来模拟它,但最终该语言只支持真假)。
-
是的,我知道 R 中的逻辑运算在这方面非常特殊。但是,pandas 和 numpy 都是为解决与 R 类似的问题而设计的,所以我想知道为什么这两个模块中没有内置 3 值逻辑?是由于一些技术限制还是作者的某种合理的设计决定?
-
@sztal 注意,你没有在上面的代码中使用
pandas。所有这些都是纯 python,除了你使用的是 numpy 模块的属性,np.nan,但这与float('nan')相同,它只是普通的 Python,所以你甚至没有真正使用 numpy。跨度>
标签: python pandas numpy logical-operators