对dataframe列应用模糊匹配并将结果保存到新列中

2024-05-14 20:05:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,每个数据帧有不同的行数。下面是每个数据集的几行

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模块的几个不同的匹配命令将df1['Company']下的每个字符串与df2['FDA Company']下的每个字符串进行比较,并返回最佳匹配的值及其名称。我想把它放在一个新的专栏里。例如,如果我对df1['Company']中的LACKY SHEET METAL执行fuzz.ratiofuzz.token_sort_ratio操作,则返回的最佳匹配是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) 

但由于列的长度不同而出错。

我被难住了。我怎样才能做到这一点?


Tags: citydatazipcompanysheetmodf1state
1条回答
网友
1楼 · 发布于 2024-05-14 20:05:46

我不知道你在做什么。我就是这样做的。

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'])

metrics应用于compare系列

compare.apply(metrics)

enter image description here

下一部分有很多方法:

df1的每一行进行最接近的匹配

compare.apply(metrics).unstack().idxmax().unstack(0)

enter image description here

df2的每一行进行最接近的匹配

compare.apply(metrics).unstack(0).idxmax().unstack(0)

enter image description here

相关问题 更多 >

    热门问题