在数据框列中应用模糊匹配并将结果保存在新列中
Apply fuzzy matching across a dataframe column and save results in a new column
我有两个数据框,每个数据框都有不同的行数。下面是每个数据集的几行
df1 =
Company City State ZIP
FREDDIE LEES AMERICAN GOURMET SAUCE St. Louis MO 63101
CITYARCHRIVER 2015 FOUNDATION St. Louis MO 63102
GLAXOSMITHKLINE CONSUMER HEALTHCARE St. Louis MO 63102
LACKEY SHEET METAL St. Louis MO 63102
和
df2 =
FDA Company FDA City FDA State FDA ZIP
LACKEY SHEET METAL St. Louis MO 63102
PRIMUS STERILIZER COMPANY LLC Great Bend KS 67530
HELGET GAS PRODUCTS INC Omaha NE 68127
ORTHOQUEST LLC La Vista NE 68128
我使用 combined_data = pandas.concat([df1, df2], axis = 1)
并排加入了他们。我的下一个目标是使用来自 fuzzy wuzzy
模块的几个不同匹配命令和 return 最佳匹配的值来比较 df1['Company']
下的每个字符串和 df2['FDA Company']
中的每个字符串其名称。我想将其存储在新列中。例如,如果我在 df1['Company']
到 df2['FDA Company']
中的 LACKY SHEET METAL
上执行 fuzz.ratio
和 fuzz.token_sort_ratio
,那么 return 最佳匹配是 LACKY SHEET METAL
得分为 100
,然后将其保存在 combined data
中的新列下。结果看起来像
combined_data =
Company City State ZIP FDA Company FDA City FDA State FDA ZIP fuzzy.token_sort_ratio match fuzzy.ratio match
FREDDIE LEES AMERICAN GOURMET SAUCE St. Louis MO 63101 LACKEY SHEET METAL St. Louis MO 63102 LACKEY SHEET METAL 100 LACKEY SHEET METAL 100
CITYARCHRIVER 2015 FOUNDATION St. Louis MO 63102 PRIMUS STERILIZER COMPANY LLC Great Bend KS 67530
GLAXOSMITHKLINE CONSUMER HEALTHCARE St. Louis MO 63102 HELGET GAS PRODUCTS INC Omaha NE 68127
LACKEY SHEET METAL St. Louis MO 63102 ORTHOQUEST LLC La Vista NE 68128
我试过
combined_data['name_ratio'] = combined_data.apply(lambda x: fuzz.ratio(x['Company'], x['FDA Company']), axis = 1)
但是由于列的长度不同而出现错误。
我很难过。我怎样才能做到这一点?
我不知道你在做什么。我就是这样做的。
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
创建一系列元组进行比较:
compare = pd.MultiIndex.from_product([df1['Company'],
df2['FDA Company']]).to_series()
创建一个特殊函数来计算模糊指标和return一个系列。
def metrics(tup):
return pd.Series([fuzz.ratio(*tup),
fuzz.token_sort_ratio(*tup)],
['ratio', 'token'])
将metrics
应用于compare
系列
compare.apply(metrics)
有很多方法可以完成下一部分:
获取与 df1
的每一行最接近的匹配项
compare.apply(metrics).unstack().idxmax().unstack(0)
获取与 df2
的每一行最接近的匹配项
compare.apply(metrics).unstack(0).idxmax().unstack(0)
我有两个数据框,每个数据框都有不同的行数。下面是每个数据集的几行
df1 =
Company City State ZIP
FREDDIE LEES AMERICAN GOURMET SAUCE St. Louis MO 63101
CITYARCHRIVER 2015 FOUNDATION St. Louis MO 63102
GLAXOSMITHKLINE CONSUMER HEALTHCARE St. Louis MO 63102
LACKEY SHEET METAL St. Louis MO 63102
和
df2 =
FDA Company FDA City FDA State FDA ZIP
LACKEY SHEET METAL St. Louis MO 63102
PRIMUS STERILIZER COMPANY LLC Great Bend KS 67530
HELGET GAS PRODUCTS INC Omaha NE 68127
ORTHOQUEST LLC La Vista NE 68128
我使用 combined_data = pandas.concat([df1, df2], axis = 1)
并排加入了他们。我的下一个目标是使用来自 fuzzy wuzzy
模块的几个不同匹配命令和 return 最佳匹配的值来比较 df1['Company']
下的每个字符串和 df2['FDA Company']
中的每个字符串其名称。我想将其存储在新列中。例如,如果我在 df1['Company']
到 df2['FDA Company']
中的 LACKY SHEET METAL
上执行 fuzz.ratio
和 fuzz.token_sort_ratio
,那么 return 最佳匹配是 LACKY SHEET METAL
得分为 100
,然后将其保存在 combined data
中的新列下。结果看起来像
combined_data =
Company City State ZIP FDA Company FDA City FDA State FDA ZIP fuzzy.token_sort_ratio match fuzzy.ratio match
FREDDIE LEES AMERICAN GOURMET SAUCE St. Louis MO 63101 LACKEY SHEET METAL St. Louis MO 63102 LACKEY SHEET METAL 100 LACKEY SHEET METAL 100
CITYARCHRIVER 2015 FOUNDATION St. Louis MO 63102 PRIMUS STERILIZER COMPANY LLC Great Bend KS 67530
GLAXOSMITHKLINE CONSUMER HEALTHCARE St. Louis MO 63102 HELGET GAS PRODUCTS INC Omaha NE 68127
LACKEY SHEET METAL St. Louis MO 63102 ORTHOQUEST LLC La Vista NE 68128
我试过
combined_data['name_ratio'] = combined_data.apply(lambda x: fuzz.ratio(x['Company'], x['FDA Company']), axis = 1)
但是由于列的长度不同而出现错误。
我很难过。我怎样才能做到这一点?
我不知道你在做什么。我就是这样做的。
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
创建一系列元组进行比较:
compare = pd.MultiIndex.from_product([df1['Company'],
df2['FDA Company']]).to_series()
创建一个特殊函数来计算模糊指标和return一个系列。
def metrics(tup):
return pd.Series([fuzz.ratio(*tup),
fuzz.token_sort_ratio(*tup)],
['ratio', 'token'])
将metrics
应用于compare
系列
compare.apply(metrics)
有很多方法可以完成下一部分:
获取与 df1
compare.apply(metrics).unstack().idxmax().unstack(0)
获取与 df2
compare.apply(metrics).unstack(0).idxmax().unstack(0)