为什么 pandas "None | True" return 为假而 Python "None or True" return 为真?

Why does pandas "None | True" return False when Python "None or True" returns True?

纯Python,None or TruereturnsTrue.
但是,当我在两个包含 None 值的系列之间执行 pandas 时,pandas 结果并不像我预期的那样:

>>> df.to_dict()
{'buybox': {0: None}, 'buybox_y': {0: True}}
>>> df
    buybox  buybox_y
0   None    True

>>> df['buybox'] = (df['buybox'] | df['buybox_y'])
>>> df
    buybox  buybox_y
0   False   True

预期结果:

>>> df
    buybox  buybox_y
0   True    True

我通过两次应用 OR 运算得到了我想要的结果,但我不明白为什么我应该这样做。

我不是在寻找解决方法(我通过连续两次应用 df['buybox'] = (df['buybox'] | df['buybox_y']) 得到了它)而是一个解释,因此标题中的 'why'。

Pandas | 运算符不依赖于 Python or expression,并且行为不同。

如果两个操作数都是布尔值,则结果是数学定义的,Python 和 Pandas 也是如此。

但在您的案例中,系列“buybox”的类型为 object,而“buybox_y”的类型为 bool。在这种情况下 Pandas | 运算符是 not commutative:

  • 右操作数被强制转换为布尔值
  • 然后尝试 bitwise or
    • None | True是无效操作,导致None
  • 并且结果被强制转换为布尔值

因此,

>>> df['buybox'] | df['buybox_y']
0  False

>>> df['buybox_y'] | df['buybox']
0  True

为了获得可预测的结果,您可以清理数据,并在尝试布尔运算之前使用 Pandas astype 转换为布尔类型。

对于布尔对象(即Py_True和Py_False),代码将进入快速处理分支;对于其他对象,PyObject_IsTrue() 将用于计算 int 类型的值。

在计算过程中,PyObject_IsTrue()函数会依次获取nb_bool、mp_length、sq_length的值,应该对应到bool()和len().

这两个魔术方法的return值