Как использовать FuzzyWuzzy в Python для сопоставления имен между двумя фреймами данных?

У меня дф1 и дф2. Я хочу использовать fuzzywuzzy, чтобы сопоставить столбец A в df1 со столбцом A в df2 и вернуть идентификатор в столбце B df2 на основе определенного соотношения соотношений.

Например:

df1 выглядит так:


Имя

Салли продает ракушки


дф2 выглядит так:


Имя | Я БЫ

Салли продает ракушки | 28904


Я пытаюсь сравнить все в столбце A в df1, найти совпадение в столбце A в df2 и вернуть идентификатор из столбца B в df2.

Я хотел бы иметь возможность установить критерии нечеткого соотношения. Например: я хочу, чтобы он возвращал идентификатор только в том случае, если соотношение выше 50.

Мой текущий код:

import pandas as pd
import numpy as np
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
df1=pd.read_csv('C:\\Users\\nkurdob\\Desktop\\Sheet1.csv')
df2=pd.read_csv('C:\\Users\\nkurdob\\Desktop\\Sheet2.csv')


for i in range(len(df1)):
    em = df1['A'][i]
    test = fuzz.partial_ratio(em, df2['A']) 
    if test > 50:
        print df1['A'][i]==df2['B']

person Window    schedule 27.02.2017    source источник


Ответы (1)


Во-первых, спасибо за вопрос, я никогда раньше не использовал fuzzywuzzy...

Это мой взгляд на ваш вопрос.

Здесь я пытаюсь сопоставить столбец name в 2 фреймах данных, и я покажу только результаты, которые имеют более 50 баллов.

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

import pandas as pd
import numpy as np
from fuzzywuzzy import fuzz
from fuzzywuzzy import process

d1={1:'Tim','2':'Ted',3:'Sally',4:'Dick',5:'Ethel'}
d2={1:'Tam','2':'Tid',3:'Sally',4:'Dicky',5:'Aardvark'}

df1=pd.DataFrame.from_dict(d1,orient='index')
df2=pd.DataFrame.from_dict(d2,orient='index')

df1.columns=['Name']
df2.columns=['Name']

def match(Col1,Col2):
    overall=[]
    for n in Col1:
        result=[(fuzz.partial_ratio(n, n2),n2) 
                for n2 in Col2 if fuzz.partial_ratio(n, n2)>50
               ]
        if len(result):
            result.sort()    
            print('result {}'.format(result))
            print("Best M={}".format(result[-1][1]))
            overall.append(result[-1][1])
        else:
            overall.append(" ")
    return overall

print(match(df1.Name,df2.Name))

Когда это запустится, вы должны увидеть вывод, подобный этому.

result [(67, 'Tam'), (67, 'Tid')]
Best M=Tid
result [(67, 'Tid')]
Best M=Tid
result [(100, 'Sally')]
Best M=Sally
result [(100, 'Dicky')]
Best M=Dicky
['Tid', 'Tid', 'Sally', 'Dicky', ' ']

Очевидно, я показываю только промежуточные результаты, чтобы продемонстрировать, что предложение сопоставления значений работает.

Затем я сортирую список кортежей (поскольку они были сохранены в порядке «оценка, затем значение»), беру последний (вы можете изменить порядок сортировки и взять верхнее значение на свое усмотрение), затем я беру второй элемент ([1 ]) из кортежа.

Это должно работать для любых двухстрочных столбцов, но я не проверял это.

person Tim Seed    schedule 03.09.2017
comment
Привет, можешь попробовать ответить в этой теме? stackoverflow .com/questions/68413792/ - person Titanium; 17.07.2021