Объединить две панды DF на основе частичного совпадения - PullRequest
0 голосов
/ 06 июня 2018

Извините за неопределенный заголовок, это сложно объяснить.

У меня есть два pandas df's, которые содержат связанную информацию.Один содержит данные, которые отображают метки времени, когда должно произойти событие, а другой - данные, когда это событие действительно происходит.

Я хочу определить разницу между этими временными метками.Проблема заключается в значениях, которые представляют каждый, где эти события немного различаются.Они похожи, но не идентичны.Поэтому трудно merge или concatenate при одинаковом значении.

Первый df - это когда события должны произойти:

Пример df:

Sched = pd.DataFrame({
        'E' : ['Home','Shops','Away','Shops','Home'],     
        'F' : ['10:00:00','11:00:00','12:00:00','13:00:00','14:00:00'],        
        'G' : ['No: 10', 'No: 2', 'No: 1','No: 3','No: 11'],                                 
        })

То есть место, где происходят события, помечено Column E.например, Home, Shops, Away.

Этот df отображается, когда событие действительно происходит:

Meet = pd.DataFrame({
        'A' : ['10:00:05','11:00:05','12:00:05','13:00:05','14:00:05'],
        'B' : ['HOME LOCK','AWAY HR','SHOPS JK','HOME LOCK','SHOPS JK'],
        'C' : ['No:','No:','No:','No:','No:'],         
        'D' : ['10', '1', '2','11','3'],                               
        })

Таким образом, данные в Column B находятся на том же собрании (дома, в гостях, магазинах), но естьнесколько отличий.Это все заглавными буквами, есть несколько дополнительных строк для некоторых.

Я рассмотрел попытку сопоставить соответствующие коды с использованием:

Code = pd.DataFrame({
        'H' : ['HOME LOCK','AWAY HR','SHOPS JK'],
        'I' : ['Home','Away','Shops'],                                        
        })

Meet['B'] = Meet['B'].map(Code.set_index('H')['I'])

Таким образом, я мог бы объединить вывод сsched df.Проблема в том, что существуют сотни кодов, и они постоянно меняются каждый день.

Есть ли способ сделать частичное совпадение значений?Например, можно ли объединить значения, которые в значительной степени совпадают?

1 Ответ

0 голосов
/ 06 июня 2018

Я считаю возможным использовать title с split, если первое слово соответствует:

Meet['E'] = Meet.B.str.title().str.split().str[0]
print (Meet)
          A          B    C   D      E
0  10:00:05  HOME LOCK  No:  10   Home
1  11:00:05    AWAY HR  No:   1   Away
2  12:00:05   SHOPS JK  No:   2  Shops
3  13:00:05  HOME LOCK  No:  11   Home
4  14:00:05   SHOPS JK  No:   3  Shops

Другое более общее решение - использовать extract возможными словами, соединенными | для регулярного выражения ИЛИ:

Meet['E'] = Meet.B.str.title().str.extract('(Home|Away|Shops)')
print (Meet)
          A          B    C   D      E
0  10:00:05  HOME LOCK  No:  10   Home
1  11:00:05    AWAY HR  No:   1   Away
2  12:00:05   SHOPS JK  No:   2  Shops
3  13:00:05  HOME LOCK  No:  11   Home
4  14:00:05   SHOPS JK  No:   3  Shops

что должно быть более динамичным, если создать шаблон по уникальным значениям E столбца Sched с \b для границы слова:

pat = '|'.join(r"\b{}\b".format(x) for x in Sched.E.unique())
print (pat)
\bHome\b|\bShops\b|\bAway\b

Meet['E'] = Meet.B.str.title().str.extract('(' + pat + ')')
print (Meet)
          A          B    C   D      E
0  10:00:05  HOME LOCK  No:  10   Home
1  11:00:05    AWAY HR  No:   1   Away
2  12:00:05   SHOPS JK  No:   2  Shops
3  13:00:05  HOME LOCK  No:  11   Home
4  14:00:05   SHOPS JK  No:   3  Shops
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...