繁体   English   中英

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

[英]Fuzzy Wuzzy String Matching on 2 Large Data Sets Based on a Condition - python

我有2个大数据集,我已经读入Pandas DataFrames(分别为~20K行和~40K行)。 当我尝试在地址字段上使用pandas.merge直接合并这两个DF时,与行数相比,我获得了微不足道的匹配数。 所以我想我会尝试模糊字符串匹配,看它是否改善了输出匹配的数量。

我试图在DF1(20K行)中创建一个新列,这是将DF1 [地址线]上的fuzzywuzzy extractone函数应用于DF2 [addressline]的结果。 我很快意识到这将需要永远,因为它将进行近10亿次比较。

这两个数据集都有“县”字段,我的问题是:有没有办法根据“县”字段是否有条件地在两个DF中的“地址线”字段上进行模糊字符串匹配? 研究类似于我的问题我偶然发现了这个问题: 使用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))

我添加了2张图像,这些图像是导入Excel的2个不同DF的样本集。 并非所有字段都包含在内,因为它们对我的问题并不重要。 为了重申我的最终目标,我希望在其中一个DF中有一个新列,其中最重要的结果是模糊匹配地址线和第二个DF中的其他地址线,但仅适用于两个DF之间匹配的那些行。 从那里我计划合并两个dfs,一个在模糊匹配地址和第二个DF中的地址行列。 希望这听起来并不令人困惑。

您可以调整您的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM