如何使用Python中的fuzzyfuzzy来命名两个数据帧之间的匹配?

2024-05-04 09:14:46 发布

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

我有df1和df2。我想使用fuzzywuzzy将df1中的A列与df2中的A列相匹配,并根据一定的比率匹配返回df2的B列中的ID。在

例如:

df1如下所示:


姓名

莎莉卖贝壳


df2如下所示:


姓名|身份证

Sally slls sshells公司| 28904


我要做的是比较df1中A列中的所有内容,在df2的A列中找到匹配项,并从df2的B列返回ID。在

我希望能够设定模糊比率的标准。例如:我只希望它在比率大于50时返回一个ID。在

我的当前代码:

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']

Tags: csvfromimportidreadasusers比率
1条回答
网友
1楼 · 发布于 2024-05-04 09:14:46

首先谢谢你的问题,我以前从来没有用过模糊模糊。。。在

这是我对你问题的看法。在

在这里,我尝试在2个数据帧中匹配名称列,我将只显示得分大于50的结果。在

然后我将对这些结果进行concat(或替换列),在没有匹配项的地方添加空白值。。。。显然你可能想也可能不想这么做。在

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))

当这是运行时,你应该看到这样的输出。在

^{pr2}$

显然,我只显示中间结果,这样我就可以证明值匹配子句是有效的。在

然后,我对元组列表进行排序(因为它们是按score和value顺序存储的),取最后一个(您可以反向排序并将最上面的值取给您),然后从元组中获取第二个元素([1])。在

这应该适用于任何2个字符串列,但我还没有测试过。在

相关问题 更多 >