如何将设备重置后的单调递增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
函数逻辑说明
- 数据保护:先复制输入DataFrame,避免修改原始数据。
- 重置点识别:利用
diff()计算列数据的前后差值,差值小于0的位置即为重置点(正常单调递增序列差值应≥0)。 - 累计偏移计算:每遇到一个重置点,累加该点前的最大值作为偏移量,将后续所有数据加上这个累计偏移,实现连续递增的效果。
- 适配多重置场景:支持单次、多次重置的情况,无需提前知道数据的分段信息。
测试示例
# 构造含两次重置的测试数据 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
相关产品推荐
相关产品推荐

