Python pandas 检查文本列是否含指定多字符串 生成对应取值的新列
正确实现代码
使用str.contains()方法配合正则的或逻辑,结合np.where逐行判断生成目标列:
import numpy as np # 待匹配关键词列表 match_keys = ['LOB','LIFE','SHRINKER'] # 拼接为正则匹配模式,| 代表匹配任意一个关键词 match_pattern = '|'.join(match_keys) # 生成新列,满足条件赋值999,否则赋值0 df['rule1'] = np.where( df['textcolumn'].str.contains(match_pattern, case=True, na=False), 999, 0 )
参数说明
case=True:匹配时区分大小写,如果你需要忽略大小写可修改为case=Falsena=False:若文本列存在空值,空值默认按「不匹配」处理,避免返回NaN导致赋值异常
若你的匹配关键词包含
.、*、?这类正则特殊字符,拼接pattern时需要对关键词做转义处理,写法为:import re match_pattern = '|'.join(re.escape(key) for key in match_keys)
原写法错误原因
你之前的代码使用any()是对整个文本列做全局判断,只会返回一个全局的True/False,最终整列要么全是999要么全是0,无法实现逐行判断的效果。
替代写法(无需引入numpy)
如果你不想额外引入numpy依赖,也可以用pandas自带的mask方法实现:
match_keys = ['LOB','LIFE','SHRINKER'] match_pattern = '|'.join(match_keys) df['rule1'] = 0 df['rule1'] = df['rule1'].mask(df['textcolumn'].str.contains(match_pattern, case=True, na=False), 999)
内容的提问来源于stack exchange,提问作者Daniel Thomas
相关产品推荐
相关产品推荐

