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

