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

如何计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:12:33