【问题标题】:Matching and merging 2 dataframes based on partial matches of column in Python基于Python中列的部分匹配匹配和合并2个数据框
【发布时间】:2019-01-13 20:21:10
【问题描述】:

我有 2 个数据框 - 称它们为 df1df2

第一个看起来像:

df1

Name          G ID         Type         Source       Year
Washington    WTG1         Normal       Lin          2002
Washington    1            Normal       Lin          2001
Washington    4            Normal       BOX
Eddie         GT2          Normal       Lin
Mann          1            New          BOX          2018
Mann          2            Normal       BOX
Mann          SI-01        Old          Lin          2017
Mann          GGh          Old          Lin
.
.

第二个看起来像:

df2

Name          Unit ID       Year
Washington    WTG-1         2002
Washington    1             2001
Washington    4             2003
Eddie         GT02          2010
Mann          1             2018
Mann          2             2001
Mann          SI1           2017
Mann          JO            2000                       
.
.

如您所见,df1一些 Year 值,df2 有,但它是否有它是随机的。此外,df2Mann 中的 GGh 等某些值显然根本不匹配。

G IDUnit ID 是我最感兴趣的合并对象。我需要一种方法来在合并年份(这些非常准确)后创建一些条件,其中ID 值可用于合并。

条件类似于 Levenshtein 距离:

if i in df1['G ID'] 不匹配 j in df2['Unit ID'] -> Calculate LD -> 如果 distance is close enough 然后加入

我知道这是非常伪代码,但我不知道如何继续。 有没有办法做到这一点?

【问题讨论】:

标签: python python-3.x pandas dataframe merge


【解决方案1】:

您可以尝试使用difflib 中的.get_close_matches() 方法,如下所示:

import difflib

# make a key column to merge based on close matches
df2['Fuzzy_Key'] = df2.Unit_ID.map(lambda x: difflib.get_close_matches(x, df1.G_ID))

# since the values in our Fuzzy_Key column are lists, we have to convert them to strings
df2['Fuzzy_Key'] = df2.Fuzzy_Key.apply(lambda x: ''.join(map(str, x)))

输出

    Name        Unit_ID Year    Fuzzy_Key
0   Washington  WTG-1   2002    WTG1
1   Washington  1       2001    11
2   Washington  4       2003    4
3   Eddie       GT02    2010    GT2
4   Mann        1       2018    11
5   Mann        2       2001    2
6   Mann        SI1     2017    SI-01
7   Mann        JO      2000    

之后,我们可以在新创建的Fuzzy_Key上合并

pd.merge(df2, df1[['Type', 'Source', 'Year', 'G_ID']], 
         how='left', 
         left_on=['Year', 'Fuzzy_Key'], 
         right_on=['Year', 'G_ID'])

输出

    Name        Unit_ID Year    Fuzzy_Key   Type    Source  G_ID
0   Washington  WTG-1   2002    WTG1        Normal  Lin     WTG1
1   Washington  1       2001    11          NaN     NaN     NaN
2   Washington  4       2003    4           NaN     NaN     NaN
3   Eddie       GT02    2010    GT2         NaN     NaN     NaN
4   Mann        1       2018    11          NaN     NaN     NaN
5   Mann        2       2001    2           NaN     NaN     NaN
6   Mann        SI1     2017    SI-01       Old     Lin     SI-01
7   Mann        JO      2000                NaN     NaN     NaN

重要提示
它与键 (1 & 2001) 和 (1 & 2018) 不匹配,因为在创建Fuzzy_Key 列时,它接近匹配11 而不是1,如您所见在第一个输出中。我不知道为什么会发生这种情况,否则第 1 行和第 4 行也会有匹配项。

希望这是您的问题的开始。 祝你好运!

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 2019-09-17
    • 1970-01-01
    • 2021-08-22
    • 2020-10-15
    • 2020-11-30
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多