基于部分匹配组合两个pandas df

时间:2018-06-06 05:57:07

标签: python pandas merge concatenation

对于模糊的标题感到抱歉,很难解释。

我有两个pandas df's,其中包含相关信息。一个包含显示事件何时发生的时间戳的数据,另一个显示实际发生该事件的数据。

我想确定这些时间戳之间的差异。问题是表示这些事件略有不同的每个值的值。它们相似但并不相同。因此,mergeconcatenate在相同的值上很难。

第一个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中的数据属于同一会议(Home,Away,Shops),但有一些差异。它全部用大写字母表示,还有一些额外的字符串。

我考虑过使用以下方法尝试映射相应的代码:

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 :(得分:1)

如果第一个字匹配,我认为可以titlesplit一起使用:

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

另一个更通用的解决方案是使用|加上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 加入正则表达式OR的可能单词{/ 3}}:

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 列创建模式,并且TextBox用于字边界,那么应该更加动态:

DateTimePicker