为什么当Python“None或True”返回True时,pandas“NoneTrue”返回False?
在纯 Python 中,None or True返回True.
但是,当我|在两个包含 None 值的系列之间执行熊猫时,结果与我预期的不一样:
>>> 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|运算符不依赖于 Python or expression,并且行为不同。
如果两个操作数都是布尔值,则结果是数学定义的,对于 Python 和 Pandas 也是如此。
但是在您的情况下,“buybox”系列是 type object,而“buybox_y”是bool. 在这种情况下,熊猫|运算符不是可交换的:
- 右操作数被强制为布尔值
- 然后
bitwise or尝试None | True是无效操作,导致None
- 结果被强制为布尔值
因此,
>>> df['buybox'] | df['buybox_y']
0 False
>>> df['buybox_y'] | df['buybox']
0 True
对于可预测的结果,您可以astype在尝试布尔运算之前清理数据,并使用 Pandas 转换为布尔类型。
THE END
二维码