Python判断df2取值是否存在于df1字符串列并生成匹配标记
解决方案
依赖说明
使用Pandas库完成DataFrame处理,首先导入依赖:
import pandas as pd import re # 查找值包含正则特殊字符时做转义需要
示例数据构造
# 构造df1 df1 = pd.DataFrame({ 'some text': ['hello', 'world', 'my name is', 'nick'] }) # 构造df2 df2 = pd.DataFrame({ 'text to find': ['d', 'z', 'x', 'h'] })
场景1:按行对齐匹配(同序号行一一匹配)
仅判断df2第i行的查找值是否存在于df1第i行的文本中,适合两个DataFrame行数完全一致、按行对应匹配的场景:
df1['flag'] = df1.apply( lambda row: 1 if df2.loc[row.name, 'text to find'] in row['some text'] else 0, axis=1 )
场景2:全局匹配(df1每行匹配df2所有查找值)
只要df2的所有查找值中任意一个存在于df1当前行文本中就标记为1,是高频使用场景,推荐优先使用矢量化操作提高运行效率:
小数据量写法
find_list = df2['text to find'].tolist() df1['flag'] = df1['some text'].apply( lambda x: 1 if any(key in x for key in find_list) else 0 )
大数据量高性能写法(推荐)
通过正则矢量化匹配,避免逐行apply,性能提升明显:
# 拼接正则匹配规则,re.escape避免查找值包含.、*、+等正则特殊字符时报错 pattern = '|'.join(re.escape(key) for key in df2['text to find']) # 布尔匹配结果直接转0/1数值 df1['flag'] = df1['some text'].str.contains(pattern).astype(int)
示例运行结果
该场景下得到的df1如下:
| some text | flag |
|---|---|
| hello | 1 |
| world | 1 |
| my name is | 0 |
| nick | 0 |
拓展:忽略大小写匹配
如果需要不区分大小写匹配,修改正则匹配参数即可:
pattern = '|'.join(re.escape(key) for key in df2['text to find']) df1['flag'] = df1['some text'].str.contains(pattern, case=False).astype(int)
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

