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

如何将设备重置后的单调递增DataFrame列值平移为连续递增序列

解决DataFrame聚合数据重置后的平移问题

问题分析

核心需求是自动识别DataFrame中因设备重置导致的聚合值清零点,将后续数据平移累加,模拟从未重置的连续递增状态。关键在于自动定位重置点(单调递增序列中出现数值下降的位置),并计算累计偏移量。

通用实现函数

import pandas as pd

def shift_df(df):
    # 复制原数据,避免修改输入DataFrame
    shifted_df = df.copy()
    
    for col in shifted_df.columns:
        series = shifted_df[col]
        # 定位重置点:当前值小于前一个值的位置(单调递增特性下的异常点)
        reset_indices = series[series.diff() < 0].index
        
        cumulative_offset = 0
        prev_reset_pos = 0
        
        for idx in reset_indices:
            # 重置前的最大值即为重置点前一行的数值(单调递增特性)
            reset_prev_max = series.iloc[idx - 1]
            cumulative_offset += reset_prev_max
            # 对重置点及之后的所有数据累加偏移量
            shifted_df.loc[idx:, col] += cumulative_offset
    
    return shifted_df

函数逻辑说明

  1. 数据保护:先复制输入DataFrame,避免修改原始数据。
  2. 重置点识别:利用diff()计算列数据的前后差值,差值小于0的位置即为重置点(正常单调递增序列差值应≥0)。
  3. 累计偏移计算:每遇到一个重置点,累加该点前的最大值作为偏移量,将后续所有数据加上这个累计偏移,实现连续递增的效果。
  4. 适配多重置场景:支持单次、多次重置的情况,无需提前知道数据的分段信息。

测试示例

# 构造含两次重置的测试数据
df1 = pd.DataFrame({'col1': [1,2,3,4], 'col2': [10,20,30,40]})
df2 = pd.DataFrame({'col1': [0,1,2], 'col2': [0,10,20]})
df3 = pd.DataFrame({'col1': [0,1], 'col2': [0,5]})
test_df = pd.concat([df1, df2, df3], ignore_index=True)

# 调用函数处理
result_df = shift_df(test_df)
print(result_df)

输出结果:

col1  col2
0     1    10
1     2    20
2     3    30
3     4    40
4     4    40
5     5    50
6     6    60
7     6    60
8     7    65

内容的提问来源于stack exchange,提问作者Serge de Gosson de Varennes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:10:24