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

如何利用pandas还原基于.diff(5)的差分DataFrame?

如何撤销Pandas中.diff(5)的差分操作?

针对diff(5)的差分逻辑(索引i的新值 = 原索引i的值 - 原索引i-5的值),要撤销差分并还原原始数据,你可以基于原始DataFrame的前5行数据,结合差分后的结果按分组逻辑计算,具体实现如下:

核心思路

diff(5)本质是把数据按索引对5取模分成5组(索引0、5、10...为一组;1、6、11...为一组,以此类推),每组内的差分结果是当前值与同组前一个值的差。还原逻辑:

  • 前5行直接保留原始数据(每组的初始值)
  • 从第5行开始,每组后续的值 = 差分结果的累加值 + 该组的初始原始值

代码实现

方法1:直观循环法(适合小数据集)

import pandas as pd
import random

# 构造示例数据(设置随机种子保证结果可复现)
random.seed(42)
example_df = pd.DataFrame(data=random.sample(range(1, 100), 20), columns=["number"])
df_diff = example_df.diff(5)

# 初始化还原后的DataFrame,先复制前5行原始数据
restored_df = example_df.iloc[:5].copy()

# 从第5行开始,逐行计算还原值
for i in range(5, len(example_df)):
    restored_df.loc[i] = df_diff.loc[i] + example_df.loc[i-5]

# 验证结果一致性
print("原始数据与还原数据是否一致:", example_df.equals(restored_df))

方法2:向量化分组累加(适合大数据集,效率更高)

import pandas as pd
import random

random.seed(42)
example_df = pd.DataFrame(data=random.sample(range(1, 100), 20), columns=["number"])
df_diff = example_df.diff(5)

# 按索引对5取模分组,每组内计算累加和
groups = df_diff.groupby(df_diff.index % 5)
cumsum_groups = groups.cumsum()

# 拼接前5行原始数据,以及后续行的还原值(累加结果 + 对应组的初始值)
restored_df = pd.concat([
    example_df.iloc[:5],
    cumsum_groups.iloc[5:] + example_df.iloc[:5].values.flatten()
])

# 重置索引并排序(确保顺序与原始数据一致)
restored_df = restored_df.sort_index().reset_index(drop=True)

# 验证结果一致性
print("原始数据与还原数据是否一致:", example_df.equals(restored_df))

结果说明

两种方法最终都会得到与原始example_df完全一致的还原数据,其中向量化方法避免了循环,在处理大规模数据时性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:54:18