我有两个数据帧:
import pandas as pd
df1 = pd.DataFrame({'Index': [1, 2, 3, 4, 5],
'name1': ['A brewery', 'B fresh produce', '100 wines', 'C canzirri ', 'D company']})
df2 = pd.DataFrame({'Index': [1, 2, 3, 4, 5, 6, 7],
'name2': ['bvb breweries', 'A brewerIES', 'BBBB fresh produce', '100 wines', 'f C canzirri ', 'Dcompany', 'b fresh produce']})
我想生成新的列df1.similar
,对于每个df1.name1
值,df1.similar
是来自具有最高相似度的df2.name2
的对应值。
CCD_ 5的相似度最高。
例如:
from difflib import SequenceMatcher
def similiarity_ratio(a, b):
return SequenceMatcher(None, a, b).ratio()
s=[]
for i in df2['name2']:
s.append(similiarity_ratio('A brewery',i))
max(s)
所需的输出将"A brewerIES"(在df2.name2中(设置为df1.similar
,0.8设置为df1.ratio
。
我如何应用/lada来跨越df1.name1
中的所有值?
嗨,我自己也试过。愚蠢但似乎还可以。
import pandas as pd
from difflib import SequenceMatcher
def compare(a):
compare={}
for i in df2['name2']:
compare.update({i: SequenceMatcher(None, a, i).ratio()})
item = max(compare, key=compare.get)
max_ratio = max(compare.values())
return pd.Series([item, max_ratio],
index=['matched name', 'highest_similarity ratio'])
df1[['matched name', 'highest_similarity ratio']] = df1['name1'].apply(lambda x: compare(x))
df1
但我刚刚了解到,如果使用difflib.get_close_matches
,它会容易得多。