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

如何解决Pandas DataFrame列与字符串列表匹配结果不符合预期问题

问题根因

你当前使用的是无边界子串匹配规则,只要列值包含搜索词的任意字符片段就会返回True,所以会出现Toy匹配到Toyota的不符合预期的结果。另外你预期Audi A4匹配成功,说明实际需要双向匹配逻辑:要么列值包含完整的搜索词单元,要么搜索词包含完整的列值单元。

调整后代码

方案1:匹配独立语义单元(完全符合你给出的预期结果)

该方案会限制匹配必须是完整的独立单词/词组,同时支持双向包含匹配,运行后输出和你要求的预期结果完全一致:

import pandas as pd
import numpy as np
import re

Cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4', np.nan],
    'Price': [22000,25000,27000,35000, 29000],
    'Liscence Plate': ['ABC 123', 'XYZ 789', 'CBA 321', 'ZYX 987', 'DEF 456']}

df = pd.DataFrame(Cars,columns= ['Brand', 'Price', 'Liscence Plate'])
search_for_these_values = ['Honda', 'Toy', 'Ford Focus', 'Audi A4 2019']

def check_match(brand, search_list):
    if pd.isna(brand):
        return False
    for s in search_list:
        # 判断搜索词是否是列值的完整独立单元
        if re.search(fr'\b{re.escape(s)}\b', brand):
            return True
        # 判断列值是否是搜索词的完整独立单元
        if re.search(fr'\b{re.escape(brand)}\b', s):
            return True
    return False

df['Match'] = df['Brand'].apply(lambda x: check_match(x, search_for_these_values))
print(df)

方案2:仅正向完整词匹配(如果搜索列表的Audi A4 2019为笔误,实际应为Audi A4)

如果仅需要判断列值是否包含完整的搜索词单元,只需要给每个搜索词加上正则单词边界即可,代码更简洁:

import re
pattern = '|'.join([fr'\b{re.escape(s)}\b' for s in search_for_these_values])
df['Match'] = df["Brand"].str.contains(pattern, na=False)

内容的提问来源于stack exchange,提问作者user14436938

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:45:04