#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 производит прямое сравнение строк, они должны быть идентичны.