为什么当 Python "None or True" 返回 True 时,熊猫"None | True"返回 False?



在纯Python中,None or True返回True
但是,对于panda,当我在两个包含None值的Series之间执行|时,结果与我预期的不一样:

>>> 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'])获得了它(,而是一个解释,因此标题中的"为什么"。

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

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

但在你的案例系列";buybox";是类型object;buybox_y";是CCD_ 8。在这种情况下,Pandas|算子是不可交换的:

  • 右操作数被强制为布尔值
  • 则尝试CCD_ 10
    • None | True是无效操作,导致None
  • 结果被强制为布尔值

因此,

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

对于可预测的结果,您可以清理数据,并在尝试布尔运算之前使用Pandasastype强制转换为布尔类型。

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

在计算过程中,PyObject_IsTrue((函数将获得​​依次为nbool、mplength和sqlength,它们应该对应于返回值​​两个魔术方法中的bool((和len

最新更新