【问题标题】:Why python pandas does not use 3-valued logic? [duplicate]为什么 python pandas 不使用三值逻辑? [复制]
【发布时间】: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.nanTrue 值时会发生一些非常奇怪的事情。那么这里发生了什么?

编辑。 感谢 cmets,现在我看到 np.nan 被认为是“真实”的价值。那么任何人都可以解释这究竟是什么意思以及这种方法背后的基本原理是什么?

【问题讨论】:

  • Pandas 2.0 有很多变化,包括如何处理非浮点类型的空值。
  • @aryamccarthy 上面的内容不会随着pandas 2.0 而改变。这是基本的
  • 为了记录,很少有语言区分真、假和第三个“NA”值。通常,强类型意味着只有特殊常量具有布尔含义,或者如果许多对象具有布尔含义,它们最终都会被视为真或假。具有 NA 值的 R 是不寻常的;通用编程语言几乎从来没有这样的价值(你可以编写自己的逻辑来模拟它,但最终该语言只支持真假)。
  • 是的,我知道 R 中的逻辑运算在这方面非常特殊。但是,pandas 和 numpy 都是为解决与 R 类似的问题而设计的,所以我想知道为什么这两个模块中没有内置 3 值逻辑?是由于一些技术限制还是作者的某种合理的设计决定?
  • @sztal 注意,你没有在上面的代码中使用pandas。所有这些都是纯 python,除了你使用的是 numpy 模块的属性,np.nan,但这与 float('nan') 相同,它只是普通的 Python,所以你甚至没有真正使用 numpy。跨度>

标签: python pandas numpy logical-operators


【解决方案1】:

这是 numpy 行为,至少部分继承自 python:

In [11]: bool(float('nan'))
Out[11]: True

In [12]: bool(np.NaN)
Out[12]: True

(NaN 是“真实的”。)

【讨论】:

  • 注意:真实性决定了andor的行为。
  • 它甚至不是numpy 的一部分,因为np.nan 本质上是float('nan')
  • @juanpa.arrivillaga 真实!
【解决方案2】:

您错误地判断了orand 语句。

or 会以bool(value) 的形式检查第一个值是否为真,如果它是False,那么它需要第二个值。

and 另一方面检查两个值是否为True同时bool(value1)bool(value2)的形式

【讨论】:

  • 那么np.nan or True 怎么会给出nan。如果其中一个参数为真,那么无论第二个参数如何,逻辑或必须产生真。所以在这种情况下,结果应该是 True,但事实并非如此。这证明np.nan与三值逻辑不一致。
  • @sztal 不是。 np.nan 被认为是“真实的”
  • 似乎在这种情况下,python 检查第一个参数,发现它是np.nan 并(过早地)声明结果是不可确定的,但它是非常可确定的,因为参数之一是为真,所以逻辑析取也必须为真。
  • @juanpa.arrivillaga 感谢您的支持,想把它作为答案,但想先尝试一下,但手机上缺少python解释器:)
  • @juanpa.arrivillaga,“真实”到底是什么意思?在我看来,这种行为在某些情况下可能非常危险。
猜你喜欢
  • 1970-01-01
  • 2011-10-21
  • 2011-05-30
  • 2012-03-06
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多