如何计算DataFrame指定间隔行的差值并返回新DataFrame?
问题背景
现有如下结构的测试DataFrame:
Index. 0. 1. 2. 3. A. 10. 10. 10. 10. B. 20. 20. 20. 20. C. 30. 30. 30. 30. D. 40. 40. 40. 40. E. 50. 50 50. 50. F. 50. 50 50. 50. G. 50. 50 50. 50.
需要实现每隔3行计算差值的逻辑:每3行划分为一个数据块,保留第一个块首行的原始值,后续每个块首行的值减去上一个块首行的对应值,最终仅保留所有块首行,输出结构如下:
Index. 0. 1. 2. 3. A. 10. 10. 10. 10. D. 30. 30. 30. 30. G. 10. 10 10. 10.
pandas内置diff()方法默认计算相邻行/列的差值,无法直接匹配该需求,以下是几种可直接落地的实现方式。
可行实现方案
分组取首行做差法
先按步长3给所有行打上分组标签,提取每个分组的第一行,再对提取出的行做差分,首行保留原始值即可,示例代码:import pandas as pd # 构造测试数据集 df = pd.DataFrame( [ [10]*4, [20]*4, [30]*4, [40]*4, [50]*4, [50]*4, [50]*4 ], index=['A','B','C','D','E','F','G'] ) # 每3行分为一组,取每组第一行 group_first = df.groupby(df.index // 3).first() # 做差分,首行空值填充为原始值 result = group_first.diff().fillna(group_first) # 还原原始索引 result.index = df.index[::3]切片直接运算法
直接按步长3切片取出所有目标行,从第二行开始,逐行减去往前偏移3行的原始值即可,代码最简洁,运行效率最高:result = df.iloc[::3].copy() result.iloc[1:] = result.iloc[1:] - df.iloc[:-3:3].values自定义步长差分函数
如果后续需要调整差分步长,或者需要保留所有行的差分结果,可以封装通用的步长差分函数,再按需过滤目标行:def step_diff(input_df, step=3): res_df = input_df.copy() res_df.iloc[step:] = input_df.iloc[step:] - input_df.iloc[:-step].values return res_df # 计算步长为3的全量差分后,过滤出块首行 result = step_diff(df, step=3).iloc[::3]
内容的提问来源于stack exchange,提问作者sungjun cho
相关产品推荐
相关产品推荐

