基于三列(含两布尔列)为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:
| ID | Category | Shipped T/F? | Hold T/F? | NewCol |
|---|---|---|---|---|
| 123 | ABC | False | False | 1 |
| 456 | ABC | False | True | 1 |
| 789 | ABC | True | False | 1 |
| 234 | ABC | True | True | 0 |
| 567 | DEF | False | False | 0 |
| 678 | DEF | False | True | 0 |
| 135 | DEF | True | False | 0 |
| 246 | DEF | True | True | 0 |
| 369 | KGH | True | True | 0 |
内容的提问来源于stack exchange,提问作者RhettBrindle
相关产品推荐
相关产品推荐

