In pure Python, None or True returns True.
However with pandas when I'm doing a | between two Series containing None values, results are not as I expected:

>>> 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"是object型,"buybox_y"是bool型.在这种情况下,操作员为not commutative:

  • 右操作数强制为布尔值
  • then bitwise or is attempted
    • None | True是无效操作,导致None
  • 结果被强制为布尔值

因此

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

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

为了获得可预测的结果,可以在try 布尔操作之前清理数据,并使用Pandas astype强制转换为布尔类型.

Python-3.x相关问答推荐

具有多个值的极轴旋转和熔化/取消旋转(反转旋转)操作(Pandas 堆叠/取消堆叠交替/UDF覆盖)

如何使用正则表达式通过反向搜索从链接中获取特定文本

继承自 Counter 与 dict 的类实例的 Deepcopy

合并所有文件并获取特定列数据

平移数组

如何转置和 Pandas DataFrame 并命名新列?

在 pytest 中,如何测试 sys.exit('some error message')?

将逗号分隔的字符串类型系列转换为整数列表 pandas

如何向 scikit-learn 函数添加类型提示?

为什么 Sympy 不能解决我的非线性系统? Python 解释器一直在执行,直到我终止进程

导入在不同目录中定义的函数

为什么 Multiprocessing 的 Lock 不会阻止其他进程使用对象?

spinbutton调整up/down箭头

Python - For 循环数百万行

pythondecorator中的变量范围

为什么 Django South 1.0 使用 iteritems()?

python 内置的 __exit__ 参数类型是什么?

混合全局/参数和名为top的函数的奇怪python行为

Pruning in Keras

如何在 Pandas 中的超 Big Data 框上创建数据透视表