Pandas按字符串包含子串条件为DataFrame新增条件列
问题原因
你的代码存在两个核心错误,导致结果不符合预期:
- 判断逻辑维度错误:
xxx in df[col].values是判断整个列中是否存在某个单元格完全等于目标字符串,不是判断每个单元格的内容是否包含目标子串,且返回的是单个全局布尔值,无法实现逐行判断。 - 赋值逻辑错误:用原生
if/elif/else分支给列赋值时,只会进入其中一个分支,给整列所有行赋同一个固定值,不可能实现不同行返回不同结果的效果。
正确实现代码
使用pandas内置的字符串向量化方法逐行匹配,执行效率远高于逐行循环,逻辑清晰可维护:
# 定义两个判定条件 # 条件1:Type列包含'SUP - SDM',且Info列包含'Suppression total' cond_1 = df["Type"].str.contains("SUP - SDM", na=False) & df["Info"].str.contains("Suppression total", na=False) # 条件2:Type列包含'Franc SUP - Geisi',且Info列包含'Suppression partiel' cond_2 = df["Type"].str.contains("Franc SUP - Geisi", na=False) & df["Info"].str.contains("Suppression partiel", na=False) # 先给所有行默认赋值Fail,再把满足任意一个条件的行改为Correct df["check"] = "Fail" df.loc[cond_1 | cond_2, "check"] = "Correct"
代码中na=False参数用于处理列中存在空值的情况,避免空值导致判定结果异常。
注意事项
你提供的样例数据中第一行Info字段值为Suppression totale(法语拼写,末尾多了字母e),如果你的真实数据确实是这个拼写,需要把条件1里的Suppression total修改为Suppression totale,否则第一行会被判定为Fail。
运行修正匹配字符后的代码,即可得到预期结果:第一行、第四行check值为Correct,其余行为Fail。
小提示:如果需要做更灵活的字符串匹配,也可以在
str.contains()中传入正则表达式实现复杂规则判定。
内容的提问来源于stack exchange,提问作者Cherry cherry
相关产品推荐
相关产品推荐

