为什么 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 True
returnsTrue
.
但是,当我在两个包含 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值
纯Python,None or True
returnsTrue
.
但是,当我在两个包含 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值