模糊匹配两个数据帧并加入结果

Fuzzy matching two dataframes and joining on result

我正在尝试在不相同的字符串列上连接两个数据帧。我意识到这个问题已经被问了很多,但我正在努力寻找与我的需要相关的任何东西。我的代码如下

import numpy as np
import pandas as pd
from fuzzywuzzy import fuzz
from fuzzywuzzy import process

xls = pd.ExcelFile(filename)

df_1 = pd.read_excel(xls, sheet_name="Sheet 1")

df_2 = pd.read_excel(xls, sheet_name="Sheet 2")

df_2['key'] = df_2['Name'].apply(lambda x : [process.extract(x, df_1['Name'], limit=1)][0][0][0])

当时的想法是加入基于 df_2['key'] 的两个数据帧,但是当我 运行 这段代码时它 运行s 但是没有return 任何东西。 df 大小如下:df_1 (3366, 8) 和 df_2(1771, 6)

有更好的方法吗?

您最好改用 process.extractOne()。你的代码看起来像

name_list_1=df_1['Name'].tolist()
name_list_2=df_2['Name'].tolist()
key = map(lambda x : process.extractOne(x,name_list_1)[0],name_list_2)
df_1['key']=key

然后您可以在 key 列上进行联接。

这段代码returns没什么,因为它正是它应该做的。

df_2['key'] = ... 只是将 'key' 列附加到 df_2数据框。

如果你想合并数据帧,你的代码应该类似于这样:

name_list_1 = df_1['Name'].tolist()
name_list_2 = df_2['Name'].tolist()

matches = list(map(lambda x: process.extractOne(
        x, name_list_1, scorer=fuzz.token_set_ratio)[:2], name_list_2))

df_keys = pd.DataFrame(matches, columns=['key', 'score'])
df_2 = pd.merge(df_2, df_keys, left_index=True, right_index=True)
df_2 = df_2[df_2['score'] > 70]
df_3 = pd.merge(df_1, df_2, left_on='Name', right_on='key', how='outer')

print(df_3)

我用的是extractOne方法,我想这种方法更适合你的情况。使用 scorer 参数很重要,因为它会严重影响匹配结果。