如何实现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
相关产品推荐
相关产品推荐

