模糊匹配两个数据帧并加入结果
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
参数很重要,因为它会严重影响匹配结果。
我正在尝试在不相同的字符串列上连接两个数据帧。我意识到这个问题已经被问了很多,但我正在努力寻找与我的需要相关的任何东西。我的代码如下
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
参数很重要,因为它会严重影响匹配结果。