在纯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。