我有两个大数据集已经读入 Pandas DataFrames 中(分别约有 20K 行和 40K 行)。当我试图在地址字段上使用 pandas.merge 直接合并这两个 DFs 时,与行数相比,我的匹配结果很少。所以我想尝试模糊字符串匹配,看看是否能提高输出匹配的数量。
我尝试通过在 DF1(20K 行)中创建一个新列来实现这一点,该新列是将 fuzzywuzzy extractone 函数应用于 DF2[addressline] 的 DF1[addressline] 的结果。不久后我就意识到这将需要永远,因为它将进行接近10亿次比较。
这两个数据集都有“县”字段,我的要求是:是否有一种方法可以有条件地对两个 DF 中的“addressline”字段进行模糊字符串匹配,基于“county”字段相同?在研究类似我的问题时,我偶然发现了这个讨论:Fuzzy logic on big datasets using Python 但我仍然不明白如何根据县份分组/阻塞字段。非常感谢您给予任何建议!
我添加了两个示例图片,它们展示了导入Excel的两种不同DF。由于对我的问题不重要,因此并未包括所有字段。为再次强调我的最终目标,我想在其中一个DF中添加一个新列,该列将是使用模糊匹配从第二个DF的其他地址行中获取的顶部结果,但仅适用于两个DF之间县份相匹配的行。从那里开始,我计划合并这两个DF,一个基于模糊匹配的地址和第二个DF中的地址行列。希望这不会听起来令人困惑。
我尝试通过在 DF1(20K 行)中创建一个新列来实现这一点,该新列是将 fuzzywuzzy extractone 函数应用于 DF2[addressline] 的 DF1[addressline] 的结果。不久后我就意识到这将需要永远,因为它将进行接近10亿次比较。
这两个数据集都有“县”字段,我的要求是:是否有一种方法可以有条件地对两个 DF 中的“addressline”字段进行模糊字符串匹配,基于“county”字段相同?在研究类似我的问题时,我偶然发现了这个讨论: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中的地址行列。希望这不会听起来令人困惑。