Pandas按预设条件新建DataFrame列触发Series真值模糊报错如何解决?
错误原因
你遇到的报错由Pandas布尔索引的运算符优先级规则导致:Python中&(按位与)的优先级高于==(等于判断),你原代码中df['Default_prob'] == 1 & df['Default_category'] == 1会优先计算1 & df['Default_category'],得到布尔类型的Series后再和左右的==1做比较,此时就会触发“The truth value of a Series is ambiguous”的错误。
修复方案
只需要给两个布尔判断条件分别加上小括号,明确计算优先级即可,你也可以直接用Pandas向量化操作替换自定义函数的apply写法,代码更简洁运行效率也更高。
完整可运行代码
import pandas as pd df = {'category': ['retail', 'retail', 'airtime', 'electronic', 'retail', 'electronic', 'retail', 'retail','airtime'], 'default': [0, 1, 1, 1,0,1,1,1,0], 'year': [2011, 2013, 2014, 2015,2016,2017,2018,2010,2009], 'value': [6000, 6500, 3000, 1200,3200,4530,2100,1000,3400]} df = pd.DataFrame(df) # 向量化操作替换自定义apply,处理效率更高 df["Default_prob"] = (df["value"] >= 2800).astype(int) df["Default_category"] = (df["category"] == "retail").astype(int) df['probability'] = 0 # 两个布尔条件分别加括号明确计算优先级 df.loc[(df['Default_prob'] == 1) & (df['Default_category'] == 1), 'probability'] = 1 print(df)
运行效果说明
运行后probability列会在同时满足value>=2800且category为retail的行取值为1,其余为0,和预期输出效果一致。
内容的提问来源于stack exchange,提问作者umagba alex
相关产品推荐
相关产品推荐

