You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas计算按钮连续状态的持续时长问题

计算Pandas中连续按钮状态的持续时长

问题背景

原始DataFrame如下:

value  time  button
 10    1000   up
 8     1100   up
 4     1150   down
 1     1200   down
 6     1225   up
 5     1300   no
 5     1350   no

需求:计算按钮处于up/down/no连续状态的持续时长,当状态变化时,用该状态最后一条记录的time减去第一条记录的time,期望结果:

button  time
up       100
down     100
up       25
no       125

错误代码分析

你尝试的代码逻辑有误,导致结果全为0:

df['same_as_prev'] = (df['button'] == df['button'].shift()).astype(int)
df['consec_rows'] = df['same_as_prev'].cumsum()
df_result = df.groupby(['button','consec_rows']).agg({'time': lambda x: x.iloc[-1]-x.iloc[0]})

问题出在consec_rows的生成逻辑:当按钮状态不变时,same_as_prev为1,累加后会让同一个连续状态的行分到不同的consec_rows组中(比如连续两行up会被分到0和1组),最终每个分组只有一行数据,时间差自然为0。

正确解决方案

核心是正确标记连续状态的分组:当按钮状态与前一行不同时,生成新的分组ID,然后按分组+按钮状态计算时间差。

完整代码:

import pandas as pd

# 构造原始DataFrame
data = {
    'value': [10, 8, 4, 1, 6, 5, 5],
    'time': [1000, 1100, 1150, 1200, 1225, 1300, 1350],
    'button': ['up', 'up', 'down', 'down', 'up', 'no', 'no']
}
df = pd.DataFrame(data)

# 生成连续状态的分组ID:状态变化时分组号+1
df['group'] = (df['button'] != df['button'].shift()).cumsum()

# 按分组和按钮状态计算持续时长
df_result = df.groupby(['group', 'button'])['time'].agg(lambda x: x.iloc[-1] - x.iloc[0]).reset_index()

# 调整结果格式,去掉group列
df_result = df_result[['button', 'time']].reset_index(drop=True)

print(df_result)

运行后得到的结果与期望一致:

button  time
0     up   100
1   down   100
2     up    25
3     no   125

内容的提问来源于stack exchange,提问作者itt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:10:28