两个数据帧的模糊匹配与连接

2021-08-02 17:12:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图连接字符串列上两个不相同的数据帧。我意识到这已经被要求了很多,但我正在努力寻找任何相关的我的需要。我的代码如下

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

xls = pd.ExcelFile(filename)

df_1 = pd.read_excel(xls, sheet_name="Sheet 1")

df_2 = pd.read_excel(xls, sheet_name="Sheet 2")

df_2['key'] = df_2['Name'].apply(lambda x : [process.extract(x, df_1['Name'], limit=1)][0][0][0])

这个想法是基于df_2['key']连接两个datframes,但是当我运行这个代码时,它运行但不返回任何东西。测向大小如下:测向1(3366,8)和测向2(1771,6)

有没有更好的办法?你知道吗

2条回答
网友
1楼 ·

您可以更好地使用process.extractOne()。你的代码看起来像

name_list_1=df_1['Name'].tolist()
name_list_2=df_2['Name'].tolist()
key = map(lambda x : process.extractOne(x,name_list_1)[0],name_list_2)
df_1['key']=key

然后可以在key列上进行连接。你知道吗

网友
2楼 ·

此代码不返回任何内容,因为它正是它应该执行的操作。你知道吗

df_2['key'] = ...只是将'key'列附加到df\u 2数据帧。你知道吗

如果要合并数据帧,代码应类似于:

name_list_1 = df_1['Name'].tolist()
name_list_2 = df_2['Name'].tolist()

matches = list(map(lambda x: process.extractOne(
        x, name_list_1, scorer=fuzz.token_set_ratio)[:2], name_list_2))

df_keys = pd.DataFrame(matches, columns=['key', 'score'])
df_2 = pd.merge(df_2, df_keys, left_index=True, right_index=True)
df_2 = df_2[df_2['score'] > 70]
df_3 = pd.merge(df_1, df_2, left_on='Name', right_on='key', how='outer')

print(df_3)

我使用extractOne方法,我想这更适合你的情况。使用scorer参数非常重要,因为它严重影响匹配结果。你知道吗

相关问题