Pandas中使用含条件与逻辑运算符的Lambda函数报错排查
解决Pandas中Lambda函数结合str.contains报错的问题
错误原因
你用sample["A"].apply(lambda x: ...)时,x是列中单个的字符串对象,而非Pandas Series。.str属性是Series专属的方法入口,单个字符串没有这个属性,所以触发AttributeError: 'str' object has no attribute 'str'。
正确解法
解法1:使用Pandas矢量化操作(推荐,效率更高)
直接利用Series的str.contains方法,通过正则表达式|连接多个关键词,一次性完成匹配,再用map转换结果:
import pandas as pd d = {"A":["Assessment Division","Division of Appeals","Calgary Audit","Halifax Market","Georgian Markers"], "B":[100,300,400,500,400]} sample = pd.DataFrame(d) # 正则匹配任意关键词,case=False表示不区分大小写(可选) sample["results"] = sample["A"].str.contains("Audit|Appeals|Assessment", case=False).map({True: "Invoice", False: "NoAction"})
解法2:保留Lambda+Apply的方式
如果坚持用apply,直接对单个字符串做成员判断,用any()简化多关键词检查:
import pandas as pd d = {"A":["Assessment Division","Division of Appeals","Calgary Audit","Halifax Market","Georgian Markers"], "B":[100,300,400,500,400]} sample = pd.DataFrame(d) reqs = ["Audit","Appeals","Assessment"] sample["results"] = sample["A"].apply(lambda x: "Invoice" if any(req in x for req in reqs) else "NoAction")
原代码问题说明
- 第一段代码:错误地对单个字符串
x调用.str.contains,应改为"Audit" in x这类直接判断。 - 第二段代码:既错误使用了
x.str,又误用了contains()和isin()的语法,逻辑完全不成立。
内容的提问来源于stack exchange,提问作者conrito345
相关产品推荐
相关产品推荐

