0

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

例如:

df1 看起来像这样:


姓名

莎莉卖贝壳


df2 看起来像这样:


姓名 | ID

Sally slls 贝壳 | 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']
4

1 回答 1

0

首先感谢您的问题,我以前从未使用过fuzzywuzzy ...

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

在这里,我试图匹配 2 个数据框中的名称列,并且我只会显示得分大于 50 的结果。

然后我将连接这些结果(或替换一列),我在没有匹配项的地方添加空白值......显然你可能想也可能不想这样做。

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

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

result [(67, 'Tam'), (67, 'Tid')]
Best M=Tid
result [(67, 'Tid')]
Best M=Tid
result [(100, 'Sally')]
Best M=Sally
result [(100, 'Dicky')]
Best M=Dicky
['Tid', 'Tid', 'Sally', 'Dicky', ' ']

我显然只显示了中间结果,因此我可以证明值匹配子句正在工作。

然后我对元组列表进行排序(因为它们是按先分后值的顺序存储的),取最后一个(你可以颠倒排序并取最高值),然后取第二个元素([1 ]) 来自元组。

这应该适用于任何 2 个字符串列,但我尚未对此进行测试。

于 2017-09-03T05:50:48.810 回答