两列不同熊猫数据框之间的部分单词匹配

问题描述

我有两个数据框,例如:

df1:

enter image description here

df2:

enter image description here

我正在尝试将任何术语与文本进行匹配。

我的代码

import sys,os
import pandas as pd
import numpy as np
from datetime import datetime,timedelta
import csv
import re

# data
data1 = {'termID': [1,55,341,41,5685],'term':['Cardic Arrest','Headache','Chest Pain','Muscle Pain','Knee Pain']}
data2 = {'textID': [25,12,52,35],'text':['Hello Mike,Good Morning!!','Oops!! My Knee pains!!','Stop Music!! my head pains','Arrest Innocent!!'
                                         ]}

#Dataframes 
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

# Matching logic
matchList=[]
for index_b,row_b in df2.iterrows():
    for index_a,row_a in df1.iterrows():
        if  row_a.term.lower() in row_b.text.lower() :   
            #print(row_b.text,row_a.term)
            matchList.append([row_b.textID,row_b.text,row_a.term,row_a.termID] )

cols = ['textID','text,','term ','termID' ]
d = pd.DataFrame(matchList,columns = cols)
print(d)

它只给了我一行作为输出

enter image description here


我有两个问题需要解决

  1. 不知道如何获得像这样的任何部分匹配的输出

enter image description here

  1. DF1 和 DF2 的大小都约为 0.4M 和 13M 记录。

有哪些最佳方法可以解决这两个问题?

解决方法

我对问题 1 有一个快速解决方案,但没有进行优化。 您只能获得一场比赛,因为“膝盖疼痛”是 df1 中唯一完整出现的术语。 我修改了 if 语句以从 df2 拆分文本并检查列表中是否有任何匹配项。 同意@jakub 的观点,即有些库可以更快地做到这一点。

# Matching logic
matchList=[]
for index_b,row_b in df2.iterrows():
    print(row_b)
    for index_a,row_a in df1.iterrows():
        if  any(word in row_a.term.lower() for word in row_b.text.lower().split()):
            #print(row_b.text,row_a.term)
            matchList.append([row_b.textID,row_b.text,row_a.term,row_a.termID] )

cols = ['textID','text,','term ','termID' ]
d = pd.DataFrame(matchList,columns = cols)
print(d)

输出

   textID                       text,term   termID
0      12      Oops!! My Knee pains!!      Knee Pain    5685
1      52  Stop Music!! my head pains       Headache      55
2      35           Arrest Innocent!!  Cardic Arrest       1