fuzzywuzzy отношение 2 столбцов, если один столбец удовлетворяет 100 процентов соответствует лучшему

Мой фрейм данных

введите здесь описание изображения

Matcher = df2['Account Name']

match = if df1['Billing Country'] == df2['Billing Country'] (process.extractOne(df1['Account Name'], Matcher))

Приведенный выше код не работает, но я хочу сделать нечеткое совпадение имени учетной записи только тогда, когда совпадает страна.


person Maneet Giri    schedule 03.05.2016    source источник
comment
Что вы, вероятно, должны сделать полное внешнее соединение для обоих фреймов данных, вычислить FuzzyRatio для каждой комбинации и отфильтровать результат для тех, которые имеют только 100% совпадение.   -  person Sam    schedule 03.05.2016
comment
Сэм: Вы предлагаете мне выполнить внешнее слияние по стране выставления счетов, а затем искать нечеткое совпадение для каждой комбинации?   -  person Maneet Giri    schedule 03.05.2016


Ответы (2)


Вот что я предлагаю. Во-первых, полное декартово соединение двух dfs:

df1.loc[:, 'MergeKey'] = 1 #create a mergekey
df2.loc[:, 'MergeKey'] = 1 #it is the same for both so that when you merge you get the cartesian product
#merge them to get the cartesian product (all possible combos)
merged = df1.merge(df2, on = 'MergeKey', suffixes = ['_1', '_2'])

Затем рассчитайте коэффициент пуха для каждой комбинации:

def fuzzratio(row):
    try: #avoid errors for example on NaN's
        return fuzz.ratio(row['Billing Country_1'], row['Billing Country_2'])
    except:
        return 0. #you'll want to expiriment w/o the try/except too
merged.loc[:, 'Ratio'] = merged.apply(fuzzratio, axis = 1) #create ratio column by applying function

Теперь у вас должен быть df с соотношением между всеми возможными комбинациями df1['Billing Country'] и df2['Billing Country']. Оказавшись там, просто отфильтруйте, чтобы получить те, где соотношение составляет 100%:

result = merged[merged.Ratio ==1]
person Sam    schedule 03.05.2016
comment
Мне жаль. Мне труднее понять. Не могли бы вы объяснить, что делает df1.loc[:, 'MergeKey'] = 1. и является ли «MergeKey» «Именем учетной записи» в этом коде - person Maneet Giri; 04.05.2016
comment
Мой код merged_file = pd.merge(df2, df1, on='Billing Country', how = 'outer') - person Maneet Giri; 04.05.2016
comment
У меня есть 3 467 624 возможных совпадения, но я не могу сохранить их в Excel. merged_file.to_excel('merged_file.xlsx') - person Maneet Giri; 04.05.2016
comment
То, что я делаю с ключом слияния, создает столбец 1 в каждом df. Тогда я присоединяюсь к этим колонкам. Это означает, что если у вас есть 10 строк в df1 и 10 строк в df2, вы получите 100 строк в объединенных. Это даст вам все возможные комбинации Country_1 и Country_2. Затем вы можете рассчитать fuzzratio для каждой возможной комбинации. - person Sam; 04.05.2016
comment
Итак, Сэм, что, если вы хотите увидеть соотношение другой пары столбцов? вы бы просто добавили еще один оператор возврата? или вам придется переписать весь оператор def? - person Cannon; 14.06.2017
comment
@Cannon, вы можете вернуть кортеж отношений и распаковать их в несколько столбцов. См., например, ответ здесь о том, как вернуть два новых столбца из приложения: stackoverflow.com/questions/36599697/ - person Sam; 15.06.2017

Я понял это немного по-другому.

сначала я объединился, используя

merged_file = pd.merge(df2, df1, on='Billing Country', how = 'left')

и когда у меня были все возможные совпадения.

я применяю fuzzywuzzy's

`Reference_data= df2['Account Name']`

`Result = process.extractOne(df1, choices)`

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

Result['ratio']= fuzz.ratio(Result['Account Name_x'],Result['Account Name_y'] )
person Maneet Giri    schedule 06.05.2016