Сначала вы должны перебрать оба dfs и сопоставить, используя условия и установить переменную в df2.
df2['match'] = False
for idx2, row2 in df2.iterrows():
match = False
for idx1, row1 in df1.iterrows():
if (SequenceMatcher(None, row1['Name'], row2['Name']).ratio())>=0.8 and \
(SequenceMatcher(None, row1['Category'], row2['Category']).ratio())>=0.8 and \
(row1['Class'] == row2['Class'] or row1['Amt $'] == row2['Amt $']):
match = True
break
df2.at[idx2, 'match'] = match
Как только у вас есть совпадения, вы удаляете дубликаты из совпадений df2['match']==True
.
df2[df2['match']==True].drop_duplicates(keep='first')
Далее вы можете объединить приведенный выше результат с несоответствиями df2['match']==False
df2[df2['match']==False].append(df2[df2['match']==True].drop_duplicates(keep='first'))
Здесь я предполагаю, что вы хотите удалить прямые дубликаты. Вы хотите удалить дубликаты на основе условий или прямых дубликатов?
На основании набора тестовых данных, которые у вас есть, «Apple» и «Apple is red» соответствуют 80%. Но SequenceMatcher(None, 'Apple', 'Apple is Red').ratio()
дает только 0,5882352941176471. Точно так же SequenceMatcher(None, 'Fruit', 'fruits').ratio()
составляет всего 0,7272727272727273. Вы ожидаете чего-то еще здесь? или ожидаемый результат не так?
В любом случае, я надеюсь, что это даст вам представление о подходе.
РЕДАКТИРОВАТЬ 1 Если вы хотите получить соответствующий df1['Name']
.
Я только сбросил df2['match']
как строку вместо логического значения и назначил df1['Name']
на df2['match']
вместо назначения True
. Затем в последнем df я объединяю строки df2
, которые имеют df2['match']==False
, и строки, не являющиеся дубликатами df2['match']==True
. Надеюсь это поможет.
df2['match'] = ''
for idx2, row2 in df2.iterrows():
match = ''
for idx1, row1 in df1.iterrows():
if (SequenceMatcher(None, row1['Name'], row2['Name']).ratio())>=0.5 and \
(SequenceMatcher(None, row1['Category'], row2['Category']).ratio())>=0.5 and \
(row1['Class'] == row2['Class'] or row1['Amt $'] == row2['Amt $']):
match = row1['Name']
break
df2.at[idx2, 'match'] = match
print(df2[df2['match']==''].append(df2[df2['match']!=''].drop_duplicates(keep='first')))