Вы можете использовать мою функцию fuzzy_merge
, которую я написал, комбинируя ее с explode
и groupby
, мы достаточно близки к вашему результату, заметьте, что это все еще нечетко соответствие, поэтому есть разница.
Вы можете попробовать поиграть с аргументом threshold
, чтобы получить желаемый результат:
mrg = (
fuzzy_merge(df1, df2, 'url', 'keyword')
.explode('matches')
.groupby('matches').agg({'matches':'size',
'click':'sum'})
)
df2['instances'] = df2['keyword'].map(mrg['matches']).fillna(0)
df2['clicks'] = df2['keyword'].map(mrg['click']).fillna(0)
keyword instances clicks
0 men 2.0 7.0
1 women 2.0 9.0
2 shoes 2.0 11.0
3 kids 0.0 0.0
Функция, используемая из связанного ответа:
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):
"""
df_1 is the left table to join
df_2 is the right table to join
key1 is the key column of the left table
key2 is the key column of the right table
threshold is how close the matches should be to return a match, based on Levenshtein distance
limit is the amount of matches that will get returned, these are sorted high to low
"""
s = df_2[key2].tolist()
m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit))
df_1['matches'] = m
m2 = df_1['matches'].apply(lambda x: [i[0] for i in x if i[1] >= threshold])
df_1['matches'] = m2
return df_1