首页 > 解决方案 > 多处理熊猫中的模糊匹配

问题描述

我有两个数据框。DF_Address,它有 347k 不同的地址和 DF_Project,它有 24k 记录

Project_Id、Project_Start_Date 和 Project_Address

我想检查 Df_Address 中我的 Project_Address 是否存在模糊匹配。如果有匹配项,我想提取相同的 Project_ID 和 Project_Start_Date。下面是我正在尝试的代码

import pandas as pd
import numpy as np
from fuzzywuzzy import fuzz
from fuzzywuzzy import process

Df_Address = pd.read_csv("Cantractor_Addresses.csv")
Df_Project = pd.read_csv("Project_info.csv")
#address = list(Df_Project["Project_Address"])

def fuzzy_match(x, choices, cutoff):
print(x)
return process.extractOne(
    x, choices=choices, score_cutoff=cutoff
)

Matched = Df_Address ["Address"].apply(
fuzzy_match,
args=(
    Df_Project ["Project_Address"], 
    80
     )
        )

此代码确实提供了元组形式的输出

('matched_string',得分)

但它也给出了类似的字符串。我还需要提取

Project_Id 和 Project_Start_Date

. 有人可以帮助我使用并行处理来实现这一点,因为数据量很大。

标签: pandasparallel-processingmultiprocessingapplyfuzzywuzzy

解决方案


您可以将元组转换为数据框,然后加入您的基础数据框。

import pandas as pd
Df_Address = pd.DataFrame({'address': ['abc','cdf'],'random_stuff':[100,200]})
Matched = (('abc',10),('cdf',20))
dist = pd.DataFrame(x)
dist.columns = ['address','distance']
final = Df_Address.merge(dist,how='left',on='address')
print(final)

输出:

  address  random_stuff  distance
0     abc           100        10
1     cdf           200        20

推荐阅读