pandas中如何为.str.contains方法添加多个待匹配字符串?
解决方案
方案1:利用str.contains原生正则OR语法
pandas的str.contains方法默认支持正则表达式,你可以用|符号拼接多个待匹配的子串,单次调用就能实现多字符串匹配,不需要重复写多行匹配逻辑。
你示例中的需求可以直接修改为:
# m1同时匹配aaa、bbb、ggg m1 = NewDataFrame['Group'].str.contains("aaa|bbb|ggg", na=False) # m2同时匹配ccc、fff m2 = NewDataFrame['Group'].str.contains("ccc|fff", na=False)
如果待匹配的字符串包含.、*、?这类正则特殊字符,建议先做转义处理避免匹配逻辑出错,也可以把关键词单独抽成列表方便后续维护:
import re # 单独维护匹配关键词列表,修改不需要动匹配逻辑 m1_keys = ["aaa", "bbb", "ggg"] m2_keys = ["ccc", "fff"] # 转义特殊字符后拼接正则规则 pattern1 = "|".join(re.escape(k) for k in m1_keys) pattern2 = "|".join(re.escape(k) for k in m2_keys) m1 = NewDataFrame['Group'].str.contains(pattern1, na=False) m2 = NewDataFrame['Group'].str.contains(pattern2, na=False)
方案2:全匹配场景用isin方法
如果你的需求是精确匹配整个单元格的完整内容,不需要模糊匹配子串,用isin方法性能更高、写法更简洁:
m1 = NewDataFrame['Group'].isin(["aaa", "bbb", "ggg"]) m2 = NewDataFrame['Group'].isin(["ccc", "fff"])
修改后完整可运行代码示例
import pandas as pd import re NewDataFrame = pd.DataFrame({'Group':['aaa','bbb','ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh'], 'N':[1,2,3,4,5,6,7,8]}) def highlight_cells(x): c2 = 'background-color: #00FF00' c1 = 'background-color: red' c = 'background-color: white' # 仅修改以下两个列表即可调整匹配规则,无需新增匹配代码行 m1_keys = ["aaa", "bbb", "ggg"] m2_keys = ["ccc", "fff"] pattern1 = "|".join(re.escape(k) for k in m1_keys) pattern2 = "|".join(re.escape(k) for k in m2_keys) m1 = NewDataFrame['Group'].str.contains(pattern1, na=False) m2 = NewDataFrame['Group'].str.contains(pattern2, na=False) colordata = pd.DataFrame(c, index=x.index, columns=x.columns) colordata.loc[m1, 'Group'] = c1 colordata.loc[m2, 'Group'] = c2 return colordata # 修正原代码变量名错误,原StartingDataFrame对应实际定义的NewDataFrame end = NewDataFrame.style.apply(highlight_cells,axis=None) end
内容的提问来源于stack exchange,提问作者project.py
相关产品推荐
相关产品推荐

