簡體   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