Pandas如何使用any()检查Series值及解决str.contains报错问题
错误原因与解决方案
1. any()逻辑恒真问题
你的写法if any("something") in df2["Symptom"]:存在语法逻辑错误:
any()函数需要传入可迭代的布尔序列作为参数,你传入字符串"something"时,Python会将字符串拆分为单个字符迭代判断,所有非空字符的布尔值都是True,因此any("something")永远返回True,相当于你在判断True in df2["Symptom"],自然永远输出yes。
正确的全局判断写法如下:
# na=False表示将列中的空值判定为不匹配,避免空值引发报错 has_target = df2["Symptom"].str.contains("something", na=False).any() print("yes" if has_target else "no")
2. 'str' object has no attribute 'str'报错问题
报错的核心原因是你调用.str方法的对象不是Series,而是单个字符串:
你使用apply(axis=1)时,传入自定义conditions函数的参数是单行数据,此时取df2["Symptom"]得到的是该行Symptom列的单个字符串值,不是Series,自然没有.str属性。
3. 子串匹配的实现方案
方案1:修改自定义apply函数
如果要在逐行判断的函数中做子串匹配,直接用Python原生的in关键字即可,不需要调用.str方法,同时修正你原有函数的语法错误:
def conditions(row): # 子串匹配逻辑 if "something" in row["Symptom"]: return "对应返回文本" # 原有完全匹配逻辑 if row["Trigram MyPortal"] == "fr": return "Something" elif row["Trigram MyPortal"] == "Be": return "* Autoconso" elif row["Trigram MyPortal"] == "De": return "* Autoconso DE" # 增加默认返回值避免无匹配时报错 else: return "" # 调用逻辑不变 df2["Deversement Service"] = df2.swifter.apply(conditions, axis=1)
方案2:向量化运算(效率更高,无需apply)
对于DataFrame的条件赋值,向量化运算的性能远高于逐行apply,推荐写法:
import numpy as np # 按优先级排列条件 cond_list = [ df2["Symptom"].str.contains("something", na=False), df2["Trigram MyPortal"] == "fr", df2["Trigram MyPortal"] == "Be", df2["Trigram MyPortal"] == "De" ] # 条件对应返回值,顺序和上面的条件一一对应 value_list = [ "对应返回文本", "Something", "* Autoconso", "* Autoconso DE" ] # default为所有条件都不满足时的默认值 df2["Deversement Service"] = np.select(cond_list, value_list, default="")
内容的提问来源于stack exchange,提问作者SRP
相关产品推荐
相关产品推荐

