如何根据一列的字符串相似性连接两个数据框架

2024-09-30 03:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,都有一个ID和一个包含字符串的列Name。它们可能是这样的:

数据帧:

DF-1                              DF-2
---------------------             ---------------------
     ID          Name                  ID          Name
1    56       aaeessa             1    12    H.P paRt 1 
2    98       1o7v9sM             2    76       aa3esza
3   175    HP. part 1             3   762    stakoverfl 
4     2     stackover             4     2       lo7v9Sm

我想计算一个元素和所有其他元素之间的字符串相似性(例如:Jaccard,Levenshtein),并选择得分最高的一个。然后匹配这两个id,这样我就可以在以后加入完整的数据帧。生成的表格应如下所示:

结果:

^{pr2}$

使用double for循环可以很容易地实现这一点,但我正在寻找一种优雅的(更快的)方法来完成这一点,可能是lambdas列表理解,或者一些pandas工具。可能是groupby和{}的组合,以获得相似性分数,但我自己无法给出解决方案。在

编辑:数据帧具有不同的长度,此函数的目的之一是确定较小数据帧的哪些元素出现在较大的数据帧中并与之匹配,而丢弃其余的元素。因此在结果表中应该只出现匹配的id对,或者ID1-NaN对(假设DF-1的行数多于DF-2)。在


Tags: 数据字符串nameid元素df相似性hp
3条回答

使用链接答案中的^{}函数:

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

mrg = fuzzy_merge(df1, df2, 'Name', 'Name', threshold=70)\
      .merge(df2, left_on='matches', right_on='Name', suffixes=['1', '2'])\
      .filter(like='ID')

输出

^{pr2}$

我建议您使用一个名为Python记录链接工具箱的库。在

导入库后,必须索引要比较的源,如下所示:

 indexer = recordlinkage.Index()

 #using url as intersection
 indexer.block('id')
 candidate_links = indexer.index(df_1, df_2)

 c = recordlinkage.Compare()

假设您想根据字符串的相似性进行比较,但它们并不完全匹配:

^{pr2}$

如果你想要一个精确的匹配,你应该使用:

c.exact('name')

使用pandas重复数据消除包:https://pypi.org/project/pandas-dedupe/

您需要使用人工输入训练分类器,然后它将使用学习的设置来匹配整个数据帧。在

首先pip install pandas-dedupe然后尝试以下操作:

import pandas as pd
import pandas_dedupe

df1=pd.DataFrame({'ID':[56,98,175],
                 'Name':['aaeessa', '1o7v9sM', 'HP. part 1']})

df2=pd.DataFrame({'ID':[12,76,762,2],
                 'Name':['H.P paRt 1', 'aa3esza', 'stakoverfl ', 'lo7v9Sm']})


#initiate matching
df_final = pandas_dedupe.link_dataframes(df1, df2, ['Name'])

# reset index
df_final = df_final.reset_index(drop=True)

# print result

print(df_final)

    ID        Name  cluster id  confidence
0   98     1o7v9sm         0.0    1.000000
1    2     lo7v9sm         0.0    1.000000
2  175  hp. part 1         1.0    0.999999
3   12  h.p part 1         1.0    0.999999
4   56     aaeessa         2.0    0.999967
5   76     aa3esza         2.0    0.999967
6  762  stakoverfl         NaN         NaN

您可以看到匹配的对被分配了一个集群和置信级别。不匹配的是nan。你现在可以随意分析这些信息了。也许只拿置信度在80%以上的结果为例。在

相关问题 更多 >

    热门问题