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”列上两个帧之间的简单匹配