У меня есть два примера кадра данных следующим образом:
df1 = pd.DataFrame({'Name': {0: 'John', 1: 'Bob', 2: 'Shiela'},
'Degree': {0: 'Masters', 1: 'Graduate', 2: 'Graduate'},
'Age': {0: 27, 1: 23, 2: 21}})
df2 = pd.DataFrame({'Name': {0: 'John S.', 1: 'Bob K.', 2: 'Frank'},
'Degree': {0: 'Master', 1: 'Graduated', 2: 'Graduated'},
'GPA': {0: 3, 1: 3.5, 2: 4}})
Я хочу объединить их на основе двух столбцов Имя и Степень с помощью метода нечеткого сопоставления, чтобы исключить возможные дубликаты. Это то, что я понял с помощью ссылки здесь:
Применение нечеткого сопоставления для столбца данных и сохранение результатов в новом столбце
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
compare = pd.MultiIndex.from_product([df1['Name'],
df2['Name']]).to_series()
def metrics(tup):
return pd.Series([fuzz.ratio(*tup),
fuzz.token_sort_ratio(*tup)],
['ratio', 'token'])
compare.apply(metrics)
compare.apply(metrics).unstack().idxmax().unstack(0)
compare.apply(metrics).unstack(0).idxmax().unstack(0)
Скажем, fuzz.ratio от имени и степени выше 80, мы считаем, что они один и тот же человек. И взял Имя и Степень от df1 по умолчанию. Как я могу получить следующий ожидаемый результат? Спасибо.
df = df1.merge(df2, on = ['Name', 'Degree'], how = 'outer')
Name Degree Age GPA duplicatedName duplicatedDegree
0 John Masters 27.0 3.0 John S. Master
1 Bob Graduate 23.0 3.5 Bob K. Graduated
2 Shiela Graduate 21.0 NaN NaN Graduated
3 Frank Graduated NaN 4.0 NaN Graduate