首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用包含秒的索引计算列中True值的持续时间

使用包含秒的索引计算列中True值的持续时间
EN

Stack Overflow用户
提问于 2021-04-29 14:09:33
回答 1查看 60关注 0票数 1

我想要计算列为True的持续时间,并在dataframe中包含几秒的索引。

我有个数据:

代码语言:javascript
运行
复制
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是运行的总数,结果如下所示:

代码语言:javascript
运行
复制
    >>> 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-29 14:25:07

创建一个唯一标记False值的助手列--这些数字表示True条纹的可能结束。然后将错误行与属于前一条线的第一个True行合并,并计算时间差之和。

代码语言:javascript
运行
复制
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的每一行:

代码语言:javascript
运行
复制
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中添加一个。

代码语言:javascript
运行
复制
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',所以我们可以计算出这些观测值之间的时间差。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67319080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档