Вы можете попробовать метод .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
он близко соответствовал до 11
, а не 1
, как вы можете видеть в первый выход. Я не мог понять, почему это произошло, иначе строки 1 и 4 также будут иметь совпадения.
Надеюсь, это начало вашей проблемы.
Удачи!