Нечеткое совпадение столбцов и объединение / объединение данных - PullRequest
2 голосов
/ 24 февраля 2020

Я пытаюсь объединить 2 кадра данных с несколькими столбцами, каждый из которых основан на сопоставлении значений в одном из столбцов каждого из них. Этот код из @Erfan отлично справляется с нечетким сопоставлением целевых столбцов, но есть и способ перенести остальные столбцы. { ссылка }

Фрейм данных

df1 = pd.DataFrame({'Key':['Apple Souce', 'Banana', 'Orange', 'Strawberry', 'John tabel']})
df2 = pd.DataFrame({'Key':['Aple suce', 'Mango', 'Orag','Jon table', 'Straw', 'Bannanna', 'Berry'],
                    'Key23':['1', '2', '3','4', '5', '6', '7'})

Функция соответствия из @Erfan, как описано в ссылке выше

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: ', '.join([i[0] for i in x if i[1] >= threshold]))
    df_1['matches'] = m2

    return df_1

Вызов функции

df = fuzzy_merge(df1, df2, 'Key', 'Key', threshold=80, limit=1)
df.sort_values(by='Key',ascending=True).reset_index()

Результат

index   Key            matches
0       Apple Souce    Aple suce
1       Banana         Bannanna
2       John tabel  
3       Orange  
4       Strawberry     Straw

Желаемый результат

index   Key            matches       Key23
0       Apple Souce    Aple suce     1
1       Banana         Bannanna      6
2       John tabel                   
3       Orange                       
4       Strawberry     Straw         5

1 Ответ

1 голос
/ 29 февраля 2020

Для тех, кому это нужно. Вот решение, которое я придумала.
merge = pd.merge(df, df2, left_on=['matches'],right_on=['Key'],how='outer').fillna(0)
Оттуда вы можете удалить ненужные или повторяющиеся столбцы и получить чистый результат примерно так:
clean = merge.drop(['matches', 'Key_y'], axis=1)

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