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

基于三列(含两布尔列)为Pandas DataFrame新增列报错排查

问题解决:TypeError: 'bool' object is not callable 及逻辑修正

错误原因分析

你的代码存在三个核心问题:

  • 错误调用布尔属性:df['Shipped T/F?'].bool是错误写法——.bool是Series的方法(需写成.bool()),但该方法仅适用于单个布尔值的Series,整列操作直接使用列本身的布尔值即可,无需额外调用。
  • 错误使用逻辑运算符:Python原生的and不能用于pandas的向量化布尔运算,必须用&,且需要用括号对每个条件分组,避免运算优先级冲突。
  • 语法缺失与条件顺序错误:条件列表中第二个和第三个条件之间漏了逗号;同时np.select按顺序匹配条件,需先定义最严格的排除规则,再匹配目标规则。

修正后的代码

import pandas as pd
import numpy as np

data=[
    ['123','ABC', False, False],
    ['456','ABC', False, True],
    ['789','ABC', True, False],
    ['234','ABC', True, True],
    ['567','DEF', False, False],
    ['678','DEF', False, True],
    ['135','DEF', True, False],
    ['246','DEF', True, True],
    ['369','KGH', True, True]
]
df = pd.DataFrame(data,columns=['ID','Category','Shipped T/F?','Hold T/F?'])

# 修正条件:先定义排除项,再匹配目标项
conditions = [
    # 情况1:非ABC分类,或是ABC但同时满足已发货和暂停
    (df['Category'] != 'ABC') | ((df['Category'] == 'ABC') & df['Shipped T/F?'] & df['Hold T/F?']),
    # 情况2:ABC分类且不同时满足已发货和暂停
    (df['Category'] == 'ABC') & ~(df['Shipped T/F?'] & df['Hold T/F?'])
]
values = [0, 1]
df['NewCol'] = np.select(conditions, values, default=0)

print(df)

简化高效写法

无需使用np.select,直接通过向量化运算生成布尔列再转成整数即可:

df['NewCol'] = ((df['Category'] == 'ABC') & ~(df['Shipped T/F?'] & df['Hold T/F?'])).astype(int)

逻辑说明:先判断是否为ABC分类,再取反“同时发货且暂停”的条件,最后将布尔值转为0/1(False→0,True→1)。

验证结果

运行后将得到你期望的DataFrame:

IDCategoryShipped T/F?Hold T/F?NewCol
123ABCFalseFalse1
456ABCFalseTrue1
789ABCTrueFalse1
234ABCTrueTrue0
567DEFFalseFalse0
678DEFFalseTrue0
135DEFTrueFalse0
246DEFTrueTrue0
369KGHTrueTrue0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:24:29