首页 > 解决方案 > 每组的活动时间差异

问题描述

这是我正在处理的海量数据的简化版本,数据按时间排序

df = pd.DataFrame({'group':['grp1','grp1','grp1','grp1', 'grp2','grp2','grp2','grp2','grp2'],'event':['foo','bar','foo','bar','foo','bar','bar','foo','bar'], 'time':[10,21,33,54,10,21,56,81,95]})

Qn:我需要找到每个组的每对 foo/bar (bar - foo) 的时间差(延迟)。group1 变得容易,因为 foo/bar 的数量相等且对齐良好(每个 foo 后跟 bar)。我会做类似的事情,

final = df.pivot_table(index = 'group', columns = 'event', values = 'time', aggfunc='sum')
final['delay'] = final['bar'] - final['foo']

grp1    32
grp2    81

上面的结果对 grp1 是好的,但对于 grp2,由于事件栏在索引 5 和 6 处重复,我将不得不忽略索引 6 处的栏值并获得结果,

grp1    32
grp2    25 

警告:事件必须按照 grp1 中的确切顺序排列。如果 bar 首先出现,则相应的时间将被忽略,我们从下一个 foo 开始。

将不胜感激这方面的建议

标签: pandas

解决方案


您可以尝试通过条件屏蔽,然后执行枢轴(注释中的内联解释):

c1 = df['event'].eq("foo")          #check if current row is foo
c2 = df['event'].shift(-1).eq("bar") #check if next row is bar
cond = c1&c2                          #chaining c1 and c2
#if cond is True , take next row as True since bar is already below foo per cond
final = (df[cond|cond.shift()].pivot_table(index = 'group', 
        columns = 'event', values = 'time', aggfunc='sum').copy())
final['bar']-final['foo']

group
grp1    32
grp2    25
dtype: int64

推荐阅读