Python 使用包含秒数的索引计算列中真值的持续时间
我想用一个包含秒数的索引计算一个列的持续时间 我有一个数据帧:Python 使用包含秒数的索引计算列中真值的持续时间,python,pandas,dataframe,Python,Pandas,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
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
数据帧的索引包含秒数。我认为最合适的方法是提取每个部分第一次出现的真值,直到找到一个假值并得到一个运行总数。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
>>df
A.
0.0错误
0.5错误
1.0错误
1.5正确<-发现首次发生(1.5)
2.0正确
4.0错误<-发现错误(4.0)(运行总数:4-1.5+RT=2.5)
8.0正确<-发现首次发生(8.0)
10.0错误<-发现错误(10.0)(运行总数:10-8+RT=4.5)
RT=4.5秒
创建一个帮助器列,该列唯一地标记False
值——这些数字表示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
为了解释合并,左数据框只是原始数据中包含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
正确的数据帧稍微复杂一些。我只取真行,但在end
上删除重复的行,因为我们只想在存在连续真值时保持第一个为真。最后,因为我们想将后面的真与假匹配,所以我们需要在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'
我们可以将第一个真值(在可能的连续真值组中)与其后的第一个假值进行匹配。由于我们将索引作为“时间”带到一起,我们可以计算这些观察值之间的时间差。是否可以分解pd.merge?或者只是描述一下你在做什么?@RMRiver我添加了一些细节来说明进入合并的帧是什么,但是合并本身是“end”列上两个帧之间的简单匹配