如何用子串DataFrame对字符串DataFrame分类并生成布尔列?
Pandas多子串批量匹配解决方案
核心思路
把第二个DataFrame里的所有子串整合成可批量匹配的规则,要么用正则一次性匹配,要么逐行检查子串存在性,最终生成布尔结果列。
方法一:正则合并匹配(高效推荐)
通过正则表达式的|逻辑实现多子串同时匹配,适合大数据量场景:
- 提取子串列并拼接成正则匹配模式
- 调用
str.contains()完成批量检查
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({"a": ["a", "abcd", "dabcd", "qwerty", "oppoupou"]}) df2 = pd.DataFrame({"substrings": ["abc", "qw", "qaz"]}) # 生成匹配模式:用|分隔所有子串 match_pattern = "|".join(df2["substrings"]) # 添加布尔结果列 df1["contains_any_sub"] = df1["a"].str.contains(match_pattern)
执行后df1的结果:
| a | contains_any_sub |
|---|---|
| a | False |
| abcd | True |
| dabcd | True |
| qwerty | True |
| oppoupou | False |
方法二:逐行遍历匹配(直观无正则干扰)
如果子串包含正则特殊字符(如.、*),或者不想用正则,可通过逐行检查实现:
import pandas as pd df1 = pd.DataFrame({"a": ["a", "abcd", "dabcd", "qwerty", "oppoupou"]}) df2 = pd.DataFrame({"substrings": ["abc", "qw", "qaz"]}) # 定义检查函数 def has_any_substring(text, substr_list): return any(sub in text for sub in substr_list) # 应用函数生成布尔列 df1["contains_any_sub"] = df1["a"].apply(has_any_substring, substr_list=df2["substrings"].tolist())
特殊场景处理
如果子串包含正则特殊字符(如$、.),方法一需要先转义字符,避免匹配异常:
import re import pandas as pd df2 = pd.DataFrame({"substrings": ["abc.", "qw*", "qaz"]}) # 转义每个子串的特殊正则字符 match_pattern = "|".join(re.escape(sub) for sub in df2["substrings"]) df1["contains_any_sub"] = df1["a"].str.contains(match_pattern)
内容的提问来源于stack exchange,提问作者asdf123
相关产品推荐
相关产品推荐

