我想要计算列为True的持续时间,并在dataframe中包含几秒的索引。
我有个数据:
df = pd.DataFrame({'a': {0.0: False, 0.5: False, 1.0:False, 1.5:True, 2.0:True, 4.0:False, 8.0:True,10.0:False}})
>>> df
a
0.0 False
0.5 False
1.0 False
1.5 True
2.0 True
4.0 False
8.0 True
10.0 False
数据文件的索引包含秒数。我认为最合适的方法是提取每段True值的第一次出现,直到找到一个false并有一个正在运行的总计。RT是运行的总数,结果如下所示:
>>> df
a
0.0 False
0.5 False
1.0 False
1.5 True < - found first occurance (1.5)
2.0 True
4.0 False < - found false (4.0) (running total: 4-1.5 + RT = 2.5)
8.0 True < - found first occurance (8.0)
10.0 False < - found false (10.0) (running total: 10-8 + RT = 4.5)
RT = 4.5 seconds
发布于 2021-04-29 14:25:07
创建一个唯一标记False
值的助手列--这些数字表示True
条纹的可能结束。然后将错误行与属于前一条线的第一个True行合并,并计算时间差之和。
df = df.rename_axis(index='time').reset_index()
df['end'] = (~df['a']).cumsum()
# time a end
#0 0.0 False 1
#1 0.5 False 2
#2 1.0 False 3
#3 1.5 True 3
#4 2.0 True 3
#5 4.0 False 4
#6 8.0 True 4
#7 10.0 False 5
res = pd.merge(df[df['a'].eq(False)],
df[df['a'].eq(True)].assign(end=df['end']+1).drop_duplicates('end'),
on='end')
# time_x a_x end time_y a_y
#0 4.0 False 4 1.5 True
#1 10.0 False 5 8.0 True
(res['time_x'] - res['time_y']).sum()
#4.5
要解释合并,左DataFrame只是原始行中包含False的每一行:
df[df['a'].eq(False)]
# time a end
#0 0.0 False 1
#1 0.5 False 2
#2 1.0 False 3
#5 4.0 False 4
#7 10.0 False 5
右边的DataFrame稍微复杂一些。我只接受True行,但drop_duplicates在end
上,因为我们只希望在存在连续True值时保留第一个 True。最后,由于我们希望将True与后面的False匹配,所以我们需要向end
中添加一个。
df[df['a'].eq(True)].assign(end=df['end']+1).drop_duplicates('end')
# time a end
#3 1.5 True 4
#6 8.0 True 5
现在,通过合并on='end'
,我们能够将第一个True (可能在一个连续的True值组中)与它后面的第一个假值匹配。由于我们把指数作为'time'
,所以我们可以计算出这些观测值之间的时间差。
https://stackoverflow.com/questions/67319080
复制相似问题