如何在Python Pandas中实现类似SQL LIKE %的任意顺序姓名匹配?
实现任意顺序多关键词匹配的方法
问题分析
你的原代码用str.contains(search)只能匹配连续的字符串片段,所以输入非连续的姓名部分(比如MICHAEL JACKSON)时,因为姓名中间夹了JOSEPH,连续匹配就失效了。要实现类似SQL里LIKE %MICHAEL% AND LIKE %JACKSON%的任意顺序匹配,得拆分关键词逐一验证。
具体实现步骤
- 拆分搜索关键词:把用户输入的姓名按空格拆成独立的关键词列表,过滤掉可能的空字符串
- 生成匹配掩码:对每个关键词,生成布尔序列标记该行姓名是否包含这个关键词
- 合并掩码:用逻辑与(
&)把所有关键词的掩码合并,只保留所有关键词都匹配的行 - 结果判断:根据合并后的结果输出匹配状态
改进后的代码
import pandas as pd # 处理输入:拆分关键词并统一大小写(避免大小写敏感问题) search_input = input('enter your name').strip().upper() keywords = [kw for kw in search_input.split() if kw] df1 = pd.read_excel('base.xlsx') # 把姓名列也转成大写,和输入统一规则 name_col = df1['.NAME.'].str.upper() # 生成所有关键词的匹配掩码 match_mask = pd.Series([True]*len(df1)) for kw in keywords: # case=False可以忽略大小写,na=False处理空值避免报错 match_mask &= name_col.str.contains(kw, case=False, na=False) # 获取所有匹配的行 matched_rows = df1[match_mask] # 输出结果 if not matched_rows.empty: print('FOUND') # 如果需要查看匹配的具体内容,取消下面的注释 # print(matched_rows) else: print('NOT FOUND.')
代码说明
- 大小写统一:通过
upper()把输入和姓名列转成大写,避免因为大小写差异漏匹配,也可以直接在str.contains里设case=False实现忽略大小写 - 性能优化:放弃原代码里的
iterrows遍历,用Pandas的向量化操作处理,效率更高 - 空值处理:
na=False确保遇到空姓名时不会抛出异常,直接标记为不匹配
扩展:支持模糊匹配(可选)
如果需要允许关键词有轻微拼写误差,可以用fuzzywuzzy库实现模糊匹配,先安装依赖:pip install fuzzywuzzy python-Levenshtein,示例代码如下:
from fuzzywuzzy import fuzz def fuzzy_match(name, keywords, threshold=80): # 阈值可以调整,越高匹配越严格 for kw in keywords: if fuzz.partial_ratio(name.upper(), kw) < threshold: return False return True # 用apply生成匹配掩码 match_mask = df1['.NAME.'].apply(lambda x: fuzzy_match(x, keywords))
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

