使用python中两个数据集的模糊匹配创建标志

2024-05-15 07:38:07 发布

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

我有两个数据集df1和df2,都有以下列:

|city   |state  |address_id |address             |postal_code
|A      |X      |10         |flat 123,abc lane   |400000

我想根据df2中是否存在相似的地址为df1中的每个地址_id创建一个二进制标志。我的原始数据集非常大(df1=5k行,df2=200K行)。我在小数据样本上尝试了以下代码集:

^{pr2}$

但这在更大的数据集上不起作用。有什么方法可以优化这一点吗?邮政编码可以作为模糊匹配时的条件,以减少迭代次数。另外,也许我可以在v=80时停止迭代。在

for i in df1.index:
    v=1
    while v<=80:
        for j in df2.index:
            vi = df1.get_value(i, 'address')
            vj = df2.get_value(j, 'address')
            v= max(fuzz.ratio(vi, vj),
               fuzz.partial_ratio(vi, vj),
               fuzz.token_sort_ratio(vi, vj),
               fuzz.token_set_ratio(vi, vj))
        if v>=80:
           df1.loc[i,'flag']='Y'
        else:
           df1.loc[i,'flag']='N'

刚开始是python,有点困在这里。请帮忙!在


Tags: 数据inidforgetindexvalueaddress
1条回答
网友
1楼 · 发布于 2024-05-15 07:38:07

我尝试了两个df的模糊比较,就我的研究而言,没有快速的方法来做。使用4fuzz方法也会降低脚本的速度。一种方法是使用'工艺提取酮()`并创建一个函数:

from fuzzywuzzy import process
def fw_process(row_df1):
    # Select the addresses from df2 with same postal_code
    df2_select_add = df2['address'][df2['postal_code'] == row_df1['postal_code']]
    ad_1 = row_df1['address']
    # Find the best match for ad_1 in df2_select_add and get the ratio with [1] 
    # for the name of df2_select_add , use [0]
    if process.extractOne(ad_1, df2_select_add)[1] >= 80:
        return 'Y'
    else:
        return 'N'

然后要在df1中创建列标志,请执行以下操作:

^{pr2}$

注意:名称df2不是作为函数的参数调用的,这不是一种更干净的方式,但是如果在代码中使用这个名称定义它,它就可以工作了。在

如果您想保留4fuzz方法,那么可以按照相同的想法创建函数:

from fuzzywuzzy import fuzz
def fw_fuzz ( row_df1):
    # Select the addresses from df2 with same postal_code
    df2_select_add = df2['address'][df2['postal_code'] == row_df1['postal_code']]
    ad_1 = row_df1['address']
    # Get the max of the max of the 4 fuzz comparison between ad_1 and df2_select_add
    if max (df2_select_add.apply(lambda x: max(fuzz.ratio(ad_1, x), fuzz.partial_ratio(ad_1, x),
                                                fuzz.token_sort_ratio(ad_1, x),fuzz.token_set_ratio(ad_1, x)))) >= 80:
        return 'Y'
    else:
        return 'N'

然后:

df1['flag'] = df1.apply(fw_fuzz, axis=1)

相关问题 更多 >