Python 如何使用模糊逻辑从熊猫数据框中匹配和提取文本?
我有两个数据框,如下所示: DF1: DF 2: 我想用模糊逻辑匹配两个数据框中名称列中的名称,并将第二个数据框中的名称列添加到第一个数据框中,如下所示:Python 如何使用模糊逻辑从熊猫数据框中匹配和提取文本?,python,pandas,Python,Pandas,我有两个数据框,如下所示: DF1: DF 2: 我想用模糊逻辑匹配两个数据框中名称列中的名称,并将第二个数据框中的名称列添加到第一个数据框中,如下所示: Name Value item buying fish hook 240 fish hook arrange lunch 75 lunch repair equipment 800 equipment purch
Name Value item
buying fish hook 240 fish hook
arrange lunch 75 lunch
repair equipment 800 equipment
purchase air condition 1400 air condition
并非所有的名字都完全匹配。DF2有几个名字,有些名字与之匹配,例如:空调和头发条件。将值从DF 1中拆分会导致未匹配,其中fish hook仅与fish匹配您可以与next
和生成器表达式一起使用。如果存在多个匹配项,此方法将按df2
中的行顺序给予优先级。如果未找到匹配项,find_key
将返回None
def find_key(x):
return next((i for i in df2['Name'].values if x in i), None)
df1['item'] = df1['Name'].apply(find_key)
此代码将比较并匹配文本。根据scorethreshold返回df2值或无。您可以根据df2的精度修改阈值。您可能还需要进行一些文本处理以获得更好的结果。我已经更新了相关示例。有几个名字有相同的单词,因为df1中有多个单词,所以我不能使用精确匹配。我尝试拆分句子,但如示例中所示,空调与头发条件匹配,名称fish hook与fish匹配。因此,使用模糊逻辑计算距离会更有帮助。@someone,好的,这将极大地改变你的问题。这是一个非常重要的问题。现在您正在尝试查找最长的字符串匹配。现在我将把答案作为一个社区维基。
Name Value item
buying fish hook 240 fish hook
arrange lunch 75 lunch
repair equipment 800 equipment
purchase air condition 1400 air condition
def find_key(x):
return next((i for i in df2['Name'].values if x in i), None)
df1['item'] = df1['Name'].apply(find_key)
from fuzzywuzzy import process
i = 0
scorethreshold = 70
df1["fuzzy"] = 0
for x in df1.Name:
noun,score,record = process.extractOne(x,df2.Name)
if score > scorethreshold:
df1.loc[i,'fuzzy'] = noun
else:
df1.loc[i,'fuzzy'] = None
i = i + 1