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相关问答推荐

如何创建多个日志(log)文件

网站抓取:当我使用Chrome DevTools中的网络选项卡时,找不到正确的URL来提供我想要的数据

按小时和日期对Pandas 数据帧进行分组

十进制浮点数到整型的转换错误

Pandas -我们如何在一行中应用多个要求

regexp多重前瞻行为的解释

msg-seviri l1.5本机文件

ValueError at /register/ 视图authenticate.views.register_user 未返回HttpResponse 对象.它返回 None 相反

SQL Server 2022和Python3.10脚本错误

使用 multiprocessing 处理图像

合并问卷中多列中的稀疏问题 - Pandas

如何使用 regex sub 根据列表中的变量替换字符

如何将虚拟变量列转换为多列?

为什么不切换到 Python 3.x?

Python:如何在三个列表中找到共同值

理解 Keras 的 ImageDataGenerator 类中的 `width_shift_range` 和 `height_shift_range` 参数

迭代dict值

Python在OrderedDict中 Select 第i个元素

如何使用 python 库连接到 poloniex.com websocket api

如何从 Python 3 导入 FileNotFoundError?