根据Python中列的部分匹配来匹配和合并2个数据帧

时间:2019-01-13 20:21:11

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

我有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值中的 some 个,但是是否具有它是随机的。同样,GGh的{​​{1}}中的Mann之类的值根本不匹配。

df2G ID是我最感兴趣的合并对象。我需要一种合并年份(这些年份非常准确)的条件,这些条件可以使用Unit ID值进行合并。

条件可能类似于Levenshtein距离:

IDif i in df1['G ID']-> j in df2['Unit ID']->不匹配,如果Calculate LD然后加入

我知道这是非常伪的代码,但是我不确定如何继续。 有办法吗?

1 个答案:

答案 0 :(得分:0)

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

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列时,它 close匹配11而不是{{1 }},如您在第一个输出中所见。我不知道为什么会这样,否则第1行和第4行也会有匹配项。

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