如何基于部分匹配合并Pandas DataFrame并解决匹配异常
问题分析与解决方案
首先,你的代码逻辑走偏了——你把标准关键词拆成单个单词去匹配,再拼接成新的字符串,这就导致拼接后的内容和Standard_Data里的完整关键词完全对不上,自然merge的时候找不到对应的工单(TICKET),出现NaN异常。
举个例子:Standard_Data里的关键词是wires stop passing traffic,你的代码会把它拆成单个单词,然后从文本里提取出stop、passing、traffic,拼接成stop passing traffic,但Standard_Data里根本没有这个关键词,所以merge时自然匹配不到对应的TICKET=60245,反而生成了无效的NaN行。
修正后的思路
我们需要直接检查完整的关键词短语(或其连续子串)是否出现在文本中,然后把每个匹配到的关键词和对应的文本、工单关联起来,而不是拆单词拼接。
修正后的代码
import pandas as pd # 读取标准关键词与工单数据(对应你的df1) Standard_Data = pd.read_excel('bOOK2.xlsx', usecols=[0,1]) # 读取待匹配的文本数据(对应你的df2) input_data = pd.read_excel('book1.xlsx', usecols=[1]) # 统一列名,避免大小写/拼写不一致的问题 input_data.columns = ['TEXT_DATA'] # 初始化结果DataFrame result = pd.DataFrame(columns=['KEYWORD', 'TEXT_DATA', 'TICKET']) # 遍历每一条待匹配文本 for _, text_row in input_data.iterrows(): current_text = text_row['TEXT_DATA'] # 找出所有匹配的关键词: # 规则是:要么完整关键词出现在文本中,要么关键词的连续子串(至少2个单词)出现在文本中 matched_keywords = Standard_Data[ Standard_Data['KEYWORD'].apply( lambda kw: # 检查完整关键词是否在文本中 kw in current_text # 检查关键词的连续多单词子串是否在文本中 or any( ' '.join(kw.split()[i:i+n]) in current_text for n in range(2, len(kw.split())+1) for i in range(len(kw.split()) - n + 1) ) ) ] # 把当前文本关联到匹配的关键词行 matched_keywords['TEXT_DATA'] = current_text # 合并到结果中 result = pd.concat([result, matched_keywords[['KEYWORD', 'TEXT_DATA', 'TICKET']]], ignore_index=True) # 打印最终结果 print(result)
运行结果
这段代码会输出你期望的结果:
KEYWORD TEXT_DATA TICKET 0 Burst of bit errors Burst of bit errors due to stop passing traffic 89814 1 wires stop passing traffic Burst of bit errors due to stop passing traffic 60245
关键调整点
- 匹配逻辑修正:不再拆单词,而是直接检查完整关键词或其连续子串是否存在于文本中,确保和
Standard_Data里的关键词完全对应。 - 数据关联方式:遍历每个文本,找出所有匹配的关键词,再将每个关键词与文本、工单一一对应,避免merge时的不匹配问题。
内容的提问来源于stack exchange,提问作者Syed Jameer
相关产品推荐
相关产品推荐

