我有2个数据帧-分别称为df1
和df2
。
第一个看起来像:
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
之类的值根本不匹配。
df2
和G ID
是我最感兴趣的合并对象。我需要一种合并年份(这些年份非常准确)的条件,这些条件可以使用Unit ID
值进行合并。
条件可能类似于Levenshtein距离:
ID
与if i in df1['G ID']
-> j in df2['Unit ID']
->不匹配,如果Calculate LD
然后加入
我知道这是非常伪的代码,但是我不确定如何继续。 有办法吗?
答案 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行也会有匹配项。
希望这是您解决问题的开始。 祝你好运!