如何解决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
相关产品推荐
相关产品推荐

