[英]Python - String Matching using Fuzzy Wuzzy (extracting single letters as opposed to words)
[英]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.