Python Fuzzywuzzy与进程匹配,并添加来自比较数据帧的信息



我正在尝试使用fuzzywuzzy和process来匹配两个数据帧(在名称列中(中的名称。结果应该是具有来自df2(dfpep(的最佳匹配名称和相似性得分的df1(dfdum(。这与下面的代码配合得很好,但除了匹配的名称和分数外,我还想在结果中添加更多从df2到df1的列。df1中还应添加df2中属于匹配名称的出生日期和居住国。我不能简单地合并名字,因为有重复的名字。

有人能帮我修改代码吗?这样我就可以添加df2中匹配名称的额外信息了?因此,我想向df1添加两个额外的列,其中包含来自df2的匹配名称的相关信息。

pep_name = []
sim_name = []
for i in dfdum.NAME:
ratio = process.extract(i, dfpep.NAME, limit=1,scorer=fuzz.token_set_ratio)
pep_name.append(ratio[0][0])
sim_name.append(ratio[0][1])
dfdum['pep_name'] = pd.Series(pep_name)
dfdum['sim_name'] = pd.Series(sim_name)

您可以在dfpep中找到最佳匹配的索引。NAME,并使用它来检索其他两列的相应值。

这段代码(带有一些模拟数据(应该会给您带来所需的结果;它假设dfpep。不过,NAME只有唯一的值。

请注意,我不是熊猫专家,所以这个解决方案决不是最快或最优雅的,但它应该能胜任这项工作:(

此外,我觉得应该有一种方法来做到这一点,而不需要for循环;也许这里有人对此有想法。

import pandas as pd
from fuzzywuzzy import process, fuzz
dfdum = pd.DataFrame(["Johnny", "Peter", "Ben"])
dfdum.columns = ["NAME"]
dfpep = pd.DataFrame(["Pete", "John", "Bennie"])
dfpep.columns = ["NAME"]
dfpep["dob"] = pd.Series(["1990", "1991", "1992"])
dfpep["cor"] = pd.Series(["USA", "UK", "Germany"])
pep_name = []
sim_name = []
dob = []
cor = []
for i in dfdum.NAME:
ratio = process.extract(i, dfpep.NAME, limit=1, scorer=fuzz.token_set_ratio)
pep_name.append(ratio[0][0])
sim_name.append(ratio[0][1])
j = dfpep.index[dfpep.NAME == ratio[0][0]].tolist()[0]
dob.append(dfpep['dob'][j])
cor.append(dfpep['cor'][j])
dfdum['pep_name'] = pd.Series(pep_name)
dfdum['sim_name'] = pd.Series(sim_name)
dfdum['dob'] = pd.Series(dob)
dfdum['cor'] = pd.Series(cor)
print(dfdum)

最新更新