【问题标题】:matching dfs containing names in pandas dataframe匹配包含熊猫数据框中名称的dfs
【发布时间】:2021-09-20 04:17:18
【问题描述】:

我有 2 个包含名称列表的数据集。 1 个数据集还具有其他名称没有的额外名称,而另一个具有重复名称。我的目标是创建一个列出所有差异并排除匹配项的第三个数据框

考虑这些数据框:

df =
 Full name
dan  lastname1
dan  lastname1
bill lastname2
bob  lastname3
brad lastname4

df2=
Full name
daniel  lastname1
william lastname2
robert  lastname3
bradley lastname4
Jane    lastname5


d3 =
Full name             match       
daniel  lastname1     dan lastname1   
william lastname2     bill lastname2
robert  lastname3     bob  lastname3
bradley lastname4     brad lastname4
Jane    lastname5     NaN

我尝试合并数据框并删除重复项,但没有运气。我认为多余的名字和昵称会让人失望。

【问题讨论】:

  • 你能用你预期的 df3 更新你的帖子吗?
  • 你可以得到df1[~df1['Full name'].isin(df2['Full name'])].drop_duplicates().reset_index(drop=True)的匹配值。

标签: python regex pandas dataframe


【解决方案1】:

使用fuzzywuzzy 包来完成您的任务:

from fuzzywuzzy import process

THRESHOLD = 80

best_match = df2['Full name'].apply(lambda x: process.extractOne(x, df1['Full name'],
                                                                 score_cutoff=THRESHOLD))

df2['match'] = best_match.apply(pd.Series)[0]

输出:

>>> df2
            Full name            match
0    daniel lastname1    dan lastname1
1  william lastname 2  bill lastname 2
2    robert lastname3    bob lastname3
3  bradley lastname 4  brad lastname 4
4     Jane lastname 5              NaN

>>> best_match
0      (dan lastname1, 90, 0)
1    (bill lastname 2, 85, 2)
2      (bob lastname3, 83, 3)
3    (brad lastname 4, 91, 4)
4                        None
Name: Full name, dtype: object

如何安装

pip install fuzzywuzzy python-levenshtein
conda install -c conda-forge fuzzywuzzy python-levenshtein

python-levenshtein 包不是强制性的,但它在字符串匹配方面提供了 4-10 倍的加速

【讨论】:

  • @aero8991。请告诉我建议的解决方案是否有效?
  • 我将打开另一个相关问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多