Python 将两只熊猫df'组合在一起;它基于部分匹配

Python 将两只熊猫df'组合在一起;它基于部分匹配,python,pandas,merge,concatenation,Python,Pandas,Merge,Concatenation,很抱歉标题不清楚,很难解释 我有两个包含相关信息的df。一个包含显示事件应发生时间戳的数据,另一个显示事件实际发生时间的数据 我想确定这些时间戳之间的差异。问题在于代表每个事件的值略有不同。它们相似但不完全相同。因此,很难对相同的值进行合并或串联 第一个df是事件发生的时间: 示例df: Sched = pd.DataFrame({ 'E' : ['Home','Shops','Away','Shops','Home'], 'F' : ['10:00:0

很抱歉标题不清楚,很难解释

我有两个包含相关信息的
df
。一个包含显示事件应发生时间戳的数据,另一个显示事件实际发生时间的数据

我想确定这些时间戳之间的差异。问题在于代表每个事件的值略有不同。它们相似但不完全相同。因此,很难对相同的值进行
合并
串联

第一个
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'],                                 
        })
因此,事件发生的位置在
列E
中标记。e、 g.
家、商店、外出

此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'],                               
        })
因此,
列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
合并。问题是有成百上千的代码,它们每天都在不断变化

有没有办法对值进行部分匹配?如中所示,基本相同的值可以合并吗?

我认为如果第一个单词匹配,可以使用:

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
如果通过
Sched
E
列的唯一值和
\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

您是否始终保证Meet的B列中的第一个单词是Sched的E列中的有效键?@coldspeed是的,第一个单词将始终相同。但METE始终为caps,Sched不可见“”。以前用于打印正则表达式模式的join。这将非常有帮助。谢谢