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

如何实现stage回落至0时重置的diff_hours条件累加计算?

解决方案

要实现需求中“stage回落至0时重置累加值为0”的逻辑,可以通过以下步骤修改原有代码:

方法一:标记重置分组后修正累加值

import pandas as pd

# 构造示例数据(替换为你的实际DataFrame)
data = {
    'diff_hours': [0, 0, 0, 1, 5, 0, 0, 7, 0, 0, 0, 6, 0],
    'stage': [0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 0, 0],
    'sensor': [20, 21, 21, 22, 21, 22, 20, 23, 24, 25, 28, 21, 22]
}
df = pd.DataFrame(data)

# 1. 生成分组标识:每次stage下降时创建新分组
df['blocks'] = df['stage'].diff().lt(0).cumsum()

# 2. 识别需要重置的分组:分组首行是从非0回落至0的情况
reset_blocks = set()
group_starts = df['blocks'].drop_duplicates(keep='first').index
for start_idx in group_starts:
    if start_idx == 0:
        continue
    prev_stage = df.loc[start_idx - 1, 'stage']
    curr_stage = df.loc[start_idx, 'stage']
    if curr_stage == 0 and prev_stage > 0:
        reset_blocks.add(df.loc[start_idx, 'blocks'])

# 3. 计算累加值,再将重置分组的acc_hours设为0
df['acc_hours'] = df.groupby('blocks')['diff_hours'].cumsum()
df.loc[df['blocks'].isin(reset_blocks), 'acc_hours'] = 0

# 清理辅助列
df = df.drop(columns='blocks')

print(df)

方法二:通过状态标记实现更简洁的逻辑

如果需要处理“回落至0后再次上升时重新累加”的通用场景,可以用以下代码:

import pandas as pd

data = {
    'diff_hours': [0, 0, 0, 1, 5, 0, 0, 7, 0, 0, 0, 6, 0, 2],
    'stage': [0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 0, 0, 1],
    'sensor': [20, 21, 21, 22, 21, 22, 20, 23, 24, 25, 28, 21, 22, 26]
}
df = pd.DataFrame(data)

# 标记重置触发点(从非0回落至0)和恢复触发点(从0上升至非0)
reset_trigger = (df['stage'] == 0) & (df['stage'].shift() > 0)
resume_trigger = (df['stage'] > 0) & (df['stage'].shift() == 0)

# 生成累加状态:0=正常累加,1=重置状态
df['state'] = 0
df.loc[reset_trigger, 'state'] = 1
df.loc[resume_trigger, 'state'] = 0
df['state'] = df['state'].ffill().astype(int)

# 按状态变化分组累加,重置状态下的行设为0
df['acc_hours'] = df.groupby((df['state'] != df['state'].shift()).cumsum())['diff_hours'].cumsum()
df.loc[df['state'] == 1, 'acc_hours'] = 0

# 清理辅助列
df = df.drop(columns='state')

print(df)

逻辑说明

  • 原有代码的问题在于:将“stage从3回落至0”的行单独分为一组后,仍然会累加该组的diff_hours,但需求要求这类分组的累加值必须重置为0。
  • 方法一通过识别这类“重置分组”,在累加后将其acc_hours强制设为0,精准匹配你的示例需求。
  • 方法二则通过标记累加状态,既处理回落重置,也支持后续再次进入非0阶段时重新开始累加,适用范围更广。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:10:28