You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用~运算符时pd.Series.sum()返回负值异常问题

布尔类型pd.Series取反求和异常问题解析

问题描述

对布尔类型的pd.Series取反后调用sum()时返回负值,但直接对原序列求和正常:

正常求和行为

import pandas as pd
pd.Series([True]).sum()  # 输出:1
pd.Series([False]).sum() # 输出:0

取反后求和异常

~pd.Series([False]).sum()  # 输出:-1
~pd.Series([True]).sum()   # 输出:-2

但单独对序列取反的结果是正确的:

~pd.Series([True])
# 输出:
# 0    False
# dtype: bool

~pd.Series([False])
# 输出:
# 0    True
# dtype: bool

原因分析

核心问题是运算符优先级:~(按位取反)的优先级高于sum()方法调用,导致代码实际执行逻辑是:先计算序列的求和结果(整数类型),再对该整数进行按位取反,而非先对布尔序列取反再求和。

  • 对于~pd.Series([False]).sum():先得到求和结果0,对整数0按位取反(Python中整数以补码存储),结果为-1。
  • 对于~pd.Series([True]).sum():先得到求和结果1,按位取反后结果为-2。

解决方法

只需调整运算顺序,确保先对布尔序列取反,再执行求和:

方法1:用括号明确优先级

通过括号包裹取反操作,强制先执行序列取反:

(~pd.Series([False])).sum()  # 输出:1
(~pd.Series([True])).sum()   # 输出:0

方法2:使用更直观的取反写法

如果觉得~容易混淆,可使用Python原生的not逻辑取反,结合apply方法:

pd.Series([False]).apply(lambda x: not x).sum()  # 输出:1
pd.Series([True]).apply(lambda x: not x).sum()   # 输出:0

或者直接用布尔比较运算实现取反:

(pd.Series([False]) == False).sum()  # 输出:1
(pd.Series([True]) == False).sum()   # 输出:0

内容的提问来源于stack exchange,提问作者MorrisseyJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:00:53