基于条件python的2个大数据集模糊模糊模糊字符串匹配

2024-05-17 10:57:02 发布

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

我有两个大数据集,我已经读入了Pandas数据帧(分别约20K行和约40K行)。当我尝试使用pandas.merge在address字段中直接合并这两个df时,与行数相比,我得到的匹配数微不足道。所以我想我会尝试模糊字符串匹配,看看它是否提高了输出匹配的数量。

为此,我尝试在DF1(20K行)中创建一个新列,这是将DF1[addressline]上的fuzzywuzzy extractone函数应用于DF2[addressline]的结果。我很快意识到,这将需要很长时间,因为它将做接近10亿的比较。

这两个数据集都有“County”字段,我的问题是:是否有方法根据相同的“County”字段在两个df中的“addressline”字段上有条件地进行模糊字符串匹配?研究与我类似的问题,我偶然发现了这个讨论:Fuzzy logic on big datasets using Python

不过,我对如何根据县对字段进行分组/阻塞仍然很模糊(不是双关语)。任何建议都将不胜感激!

import pandas as pd
from fuzzywuzzy import process

def fuzzy_match(x, choices, scorer, cutoff):
  return process.extractOne(x, choices = choices, scorer = scorer, score_cutoff= cutoff)[0]

test = pd.DataFrame({'Address1':['123 Cheese Way','234 Cookie Place','345 Pizza Drive','456 Pretzel Junction'],'ID':['X','U','X','Y']}) 
test2 = pd.DataFrame({'Address1':['123 chese wy','234 kookie Pl','345 Pizzza DR','456 Pretzel Junktion'],'ID':['X','U','X','Y']}) 
test['Address1'] = test['Address1'].apply(lambda x: x.lower()) 
test2['Address1'] = test2['Address1'].apply(lambda x: x.lower()) 
test['FuzzyAddress1'] = test['Address1'].apply(fuzzy_match, args = (test2['Address1'], fuzz.ratio, 80))

我添加了两个图像,它们是导入到Excel的两个不同df的示例集。不是所有的字段都包含在内,因为它们对我的问题不重要。为了重申我的最终目标,我希望在其中一个DF中有一个新的列,该列的最大结果是模糊地将地址行与第二个DF中的其他地址行匹配,但仅适用于两个DF之间的县匹配的那些行。从那里我计划合并两个DF,一个在模糊匹配地址上,另一个在第二个DF的地址行列上。希望这听起来不会让人困惑。


Tags: 数据字符串testpandasdf地址choicespd
1条回答
网友
1楼 · 发布于 2024-05-17 10:57:02

您可以调整您的fuzzy_match函数,将id作为变量,并在执行模糊搜索之前使用它来子集您的选择(注意,这需要将函数应用于整个数据帧,而不仅仅是地址列)

def fuzzy_match(x, choices, scorer, cutoff):
    match = process.extractOne(x['Address1'], 
                               choices=choices.loc[choices['ID'] == x['ID'], 
                                                   'Address1'], 
                               scorer=scorer, 
                               score_cutoff=cutoff)
    if match:
        return match[0]

test['FuzzyAddress1'] = test.apply(fuzzy_match, 
                                   args=(test2, fuzz.ratio, 80), 
                                   axis=1)

相关问题 更多 >