Python 如何使用模糊逻辑从熊猫数据框中匹配和提取文本?

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

我有两个数据框,如下所示: DF1:

DF 2:

我想用模糊逻辑匹配两个数据框中名称列中的名称,并将第二个数据框中的名称列添加到第一个数据框中,如下所示:

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