根据部分匹配组合两个Pandasdf

2024-04-19 14:35:56 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉标题不明确,很难解释。在

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

我想确定这些时间戳之间的区别。问题是代表这些事件的每种情况的值略有不同。它们相似,但不完全相同。所以很难merge或{}在一个相同的值上。在

第一个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。e、 g.Home, Shops, Away。在

此数据框在事件实际发生时显示:

^{pr2}$

所以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合并。问题是有成百上千的代码,它们每天都在不断地变化。在

有没有一种方法可以对值进行部分匹配?与中一样,可以合并大体相同的值吗?在


Tags: 数据no代码标题dataframedfhome时间
1条回答
网友
1楼 · 发布于 2024-04-19 14:35:56

我相信如果第一个单词匹配,^{}可以与^{}连用:

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

另一个更一般的解决方案是使用^{},用|来连接regex或:

^{pr2}$

如果使用SchedE列的唯一值创建模式,并且\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

相关问题 更多 >