25

在纯 Python 中,None or True返回True.
但是,当我在两个包含 None 值的 Series 之间进行操作时,使用 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'])连续应用两次来获得它),而是在寻找解释,因此是标题中的“为什么”。

4

2 回答 2

20

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

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

但在您的案例系列中,“buybox”是类型object,“buybox_y”是bool。在这种情况下,Pandas|运算符不是可交换的:

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

因此,

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

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

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

于 2021-04-09T21:28:11.380 回答
-1

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

在计算过程中,PyObject_IsTrue()函数会依次获取nb_bool、mp_length、sq_length的值,应该对应bool ()和len ()这两个魔术方法的返回值。

于 2021-04-15T05:17:39.910 回答