pandas - 每组的活动时间差异
问题描述
这是我正在处理的海量数据的简化版本,数据按时间排序
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 开始。
将不胜感激这方面的建议
解决方案
您可以尝试通过条件屏蔽,然后执行枢轴(注释中的内联解释):
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
推荐阅读
- swift - 是否可以在 ARKit 中的透明 SCNFloor 上投射光?
- remote-desktop - 我们如何在 RDS 上检测正在使用的远程桌面应用程序?
- java - 使用 Spring 和 JDBC,为什么我会因用户错误而拒绝访问?
- java - Java openjdk 错误:无法加载库 (java awt)
- python - 刮Instagram,但我只有1个帖子
- huawei-mobile-services - 由于包名不一致导致应用程序启动失败
- html - Divs 没有在 flex 容器内垂直对齐
- xcode - 如何修复 iOS ITMS-90809?
- tensorflow - “ValueError:无法将大小为 278540 的数组重塑为形状 (256,128,3,3)” 将 YOLOv3 .weights 转换为 .pb
- vhdl - 制作计数器时操作数出错