Сопоставление и объединение двух кадров данных на основе частичного совпадения столбца в Python - PullRequest
0 голосов
/ 13 января 2019

У меня есть 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 имеет, но это случайно, когда оно есть или нет. Кроме того, некоторые значения, такие как GGh в Mann из df2, не имеют никакого совпадения, что очевидно.

G ID и Unit ID - это то, с чем меня больше всего интересует слияние. Мне нужен способ сделать некоторые условия после слияния с Годами (они довольно точные), где значения ID могут использоваться для слияния.

Условие будет примерно таким, как расстояние Левенштейна:

if i in df1['G ID'] не совпадает j in df2['Unit ID'] -> Calculate LD -> если distance is close enough, то присоединиться

Я знаю, что это очень псевдокод, но я не уверен, что делать дальше. Есть ли способ сделать это?

1 Ответ

0 голосов
/ 14 января 2019

Вы можете попробовать метод .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 также будут иметь совпадения.

Надеюсь, это начало вашей проблемы. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...