基于列表搜索DataFrame并添加存在性标识列的实现方案问询
解决DataFrame新增匹配标记列的问题
没问题,这个需求用Pandas的矢量化操作就能高效实现,尤其适合你说的20k元素的大规模列表场景,完全不用写低效的逐行循环。
实现步骤:
首先,我们先还原你的示例数据和目标列表:
import pandas as pd # 构建你的示例DataFrame df = pd.DataFrame({ 'utid': [12342, 2345, 2122], 'description': [ 'my name is 123 amrud and nitesh', 'my name is anil', 'my name is 1234 mohan' ] }) # 你的目标名称集合(实际规模20k+元素) target_names = {"mohan", "nitesh"}
接下来是核心处理逻辑,这里兼顾了效率和匹配准确性:
import re # 将目标列表转换为正则匹配模式,用|分隔每个名称,同时转义特殊字符避免正则语法冲突 # 比如如果名称里有.、*这类字符,re.escape会自动转义,防止匹配出错 pattern = '|'.join(re.escape(name) for name in target_names) # 新增foundornot列:用str.contains做矢量化匹配,再映射为你需要的文本标签 df['foundornot'] = df['description'].str.contains( pattern, case=False, # 不区分大小写,不需要的话可以删掉这个参数 na=False # 把缺失值标记为not found,按需调整 ).map({True: 'found', False: 'not found'})
最终输出结果:
运行上面的代码后,你的DataFrame就会变成:
utid description foundornot 0 12342 my name is 123 amrud and nitesh found 1 2345 my name is anil not found 2 2122 my name is 1234 mohan found
为什么这么做?
- 效率优先:
str.contains是Pandas的矢量化操作,比逐行循环快几十倍,完全能hold住20k元素的列表和大规模DataFrame - 准确性保障:
re.escape处理目标名称,避免因为名称里的特殊正则字符导致匹配错误 - 灵活调整:可以通过修改
case参数控制是否区分大小写,na参数处理缺失值情况
内容的提问来源于stack exchange,提问作者nitesh jha
相关产品推荐
相关产品推荐

