我有两个数据框,并希望基于三个字段A
,B
和C
来加入它们。但是,A
和B
是数字值,我希望它们在联接/合并中完全匹配,但是C
是字符串值,并且我希望至少80%匹配(相似),例如,如果A
和B
在两个数据帧中都具有相同的值,并且第一个数据帧中的C
的值是abcde
,第二个数据帧中的abcdf
我仍然想在我的结果中考虑此记录。如何在python中实现呢?
答案 0 :(得分:2)
您可以使用fuzzywuzzy
from fuzzywuzzy import fuzz
df1=pd.DataFrame({'A':[1,3,2],'B':[2,2,3],'C':['aad','aac','aad']})
df2=pd.DataFrame({'A':[1,2,2],'B':[2,2,3],'C':['aad','aab','acd']})
mergedf1=df1.merge(df2,on=['A','B'])
mergedf1['ratio']=[fuzz.ratio(x,y) for x, y in zip(mergedf1['C_x'],mergedf1['C_y'])]
mergedf1#score list here , you can cut the data frame by your own limit
Out[265]:
A B C_x C_y ratio
0 1 2 aad aad 100
1 2 3 aad acd 67
答案 1 :(得分:0)
我可能首先只合并A和B,然后过滤掉C列上相似性低的任何行,所以类似:
result = df1.merge(df2, on=['A', 'B'])
# assuming sim is the similarity function that you created to calculate the similarity
idx = result.apply(lambda x: sim(c['C_x', 'C_y']) >= 0.8, axis=1)
result = result[idx]
希望有帮助!