Как применить функцию нечеткого соответствия к целевому и справочному столбцам для панелей данных pandas

****** Отредактировано с решением ниже *******

Я внимательно прочитал руководство, надеюсь, вопрос приемлем.

У меня есть два кадра данных панд, мне нужно применить функцию нечеткого соответствия к целевому и справочному столбцам и объединить данные на основе показателя сходства, сохранив исходные данные.

Я проверил похожие вопросы, например, см.:
Можно ли сделать слияние нечетких совпадений с питонами пандами? но я не могу использовать это решение. Пока что у меня есть:

df1 = pd.DataFrame({'NameId': [1,2,3], 'Type': ['Person','Person','Person'], 'RefName': ['robert johnes','lew malinsky','gioberto delle lanterne']})
df2 = pd.DataFrame({'NameId': [1,2,3], 'Type': ['Person','Person','Person'],'TarName': ['roberto johnes','lew malinosky','andreatta della blatta']})

import distance
fulldf=[]
for name1 in  df1['RefName']:
    for name2 in df2['TarName']:
        if distance.jaccard(name1, name2)<0.6:
            fulldf.append({'RefName':name1 ,'Score':distance.jaccard(name1, name2),'TarName':name2 })
pd_fulldf= pd.DataFrame(fulldf)
  1. Как я могу включить 'NameId' и 'Type' (и другие возможные столбцы) в окончательный вывод, например:

    df1_NameId  RefName         df1_Type    df1_NewColumn   Score   df2_NameId  TarName         df2_Type    df2_NewColumn
       1        robert johnes   Person           …          0.0000     1        roberto johnes  Person          …
    
  2. Есть ли способ кодировать это так, чтобы его можно было легко масштабировать и можно было выполнять с наборами данных с сотнями тысяч строк?


Я решил исходную проблему, распаковав кадры данных в цикле:

import distance
import pandas as pd
#Create test Dataframes
df1 = pd.DataFrame({'NameId': [1,2,3], 'RefName': ['robert johnes','lew       malinsky','gioberto delle lanterne']})
df2 = pd.DataFrame({'NameId': [1,2,3], 'TarName': ['roberto johnes','lew malinosky','andreatta della blatta']})
results=[]
#Create two generators objects to loop through each dataframe row one at the time
#Call each dataframe element that you want to have in the final output in the loop
#Append results to the empty list you created
for a,b,c in df1.itertuples():
    for d,e,f in df2.itertuples():
        results.append((a,b,c,distance.jaccard(c, f),e,d,f))

result_df=pd.DataFrame(results)
print(result_df)

1 ответ

Я считаю, что вам нужно это декартово произведение TarName а также RefName, Применение функции расстояния к продукту - это результат, который вам необходим.

df1["mergekey"] = 0
df2["mergekey"] = 0
df_merged = pd.merge(df1, df2, on = "mergekey")
df_merged["Distance"] = df_merged.apply(lambda x: distance.jaccard(x.RefName, x.TarName), axis = 1)

Результат:

    NameId_x    RefName Type_x  mergekey    NameId_y    TarName Type_y  Distance
0   1   robert johnes   Person  0   1   roberto johnes  Person  0.000000
1   1   robert johnes   Person  0   2   lew malinosky   Person  0.705882
2   1   robert johnes   Person  0   3   andreatta della blatta  Person  0.538462
3   2   lew malinsky    Person  0   1   roberto johnes  Person  0.764706
4   2   lew malinsky    Person  0   2   lew malinosky   Person  0.083333
5   2   lew malinsky    Person  0   3   andreatta della blatta  Person  0.666667
6   3   gioberto delle lanterne Person  0   1   roberto johnes  Person  0.533333
7   3   gioberto delle lanterne Person  0   2   lew malinosky   Person  0.588235
8   3   gioberto delle lanterne Person  0   3   andreatta della blatta  Person  0.250000
Другие вопросы по тегам