我有两个数据帧,每个数据帧具有不同的行数.下面是每个数据集的几行 df1 = Company City State ZIP FREDDIE LEES AMERICAN GOURMET SAUCE St. Louis MO 63101 CITYARCHRIVER 2015 FOUNDATION St. Louis MO 63102 GLAXOSMITHKLIN
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)并排加入.我的下一个目标是使用来自模糊模糊模块的几个不同匹配命令将df1 [‘Company’]下的每个字符串与df2 [‘FDA Company’]下的每个字符串进行比较,并返回最佳匹配值及其名称.我想将它存储在一个新列中.例如,如果我在df1 [‘Company’]到df2 [‘FDA Company’]的LACKY SHEET METAL上进行了fuzz.ratio和fuzz.token_sort_ratio,那么最好的匹配就是LACKY SHEET METAL,得分为100然后将保存在组合数据的新列下.结果看起来像
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()
创建一个特殊函数来计算模糊度量并返回一个序列.
def metrics(tup): return pd.Series([fuzz.ratio(*tup), fuzz.token_sort_ratio(*tup)], ['ratio', 'token'])
将指标应用于比较系列
compare.apply(metrics)
下一部分有很多方法可以做到这一点:
获得与df1的每一行最接近的匹配
compare.apply(metrics).unstack().idxmax().unstack(0)
获得与df2的每一行最接近的匹配
compare.apply(metrics).unstack(0).idxmax().unstack(0)