You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:55:23