Многопроцессорная обработка нечеткого соответствия в pandas

#pandas #parallel-processing #multiprocessing #apply #fuzzywuzzy

#pandas #параллельная обработка #многопроцессорная обработка #применить #fuzzywuzzy

Вопрос:

У меня есть два фрейма данных. DF_Address, содержащий 347 тысяч различных адресов, и DF_Project, содержащий 24 тысячи записей, имеющих

Project_Id, Project_Start_Date и Project_Address

Я хочу проверить, есть ли нечеткое соответствие моего Project_Address в Df_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

. Может ли кто-нибудь помочь мне достичь этого, используя параллельную обработку, поскольку данные огромны.

Ответ №1:

Вы можете преобразовать кортеж в dataframe, а затем присоединить его к вашему базовому фрейму данных.

 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
  

Комментарии:

1. Вы не выполняете нечеткое сопоставление. Слияние Pandas производит прямое сравнение строк, они должны быть идентичны.