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

如何在Pandas DataFrame中计算当前行与上方N行的百分比变化?

Pandas计算当前行与上方N行的百分比变化问题

问题描述

默认情况下,Pandas的pct_change()方法仅计算当前行与指定单一行(如前一行,或periods参数指定的行)的百分比变化。但需求是:

  • 为每行生成N列,每列对应当前行与上方第1到第N行的百分比变化
  • 数据集前N行因数据不足显示NaN,从第N+1行开始填充有效值
  • 以N=4为例:生成A、B、C、D四列,第5行Data值为110时,计算逻辑为:
    • A = 1 - 106/110 ≈ 0.0364
    • B = 1 - 104/110 ≈ 0.0545
    • C = 1 - 103/110 ≈ 0.0636
    • D = 1 - 100/110 ≈ 0.0909

解答

Pandas没有直接实现这种“当前行与上方N行逐一计算百分比变化”的原生方法,需要自行编码实现,不过可以借助Pandas的移位(shift)和向量化操作高效完成,避免低效的逐行循环。

实现示例(N=4)

假设我们有如下示例DataFrame:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({'Data': [100, 103, 104, 106, 110, 115, 120]})

接下来生成N列百分比变化:

N = 4
# 生成列名:A、B、C、D(对应上方第1到第4行)
cols = [chr(ord('A') + i) for i in range(N)]

# 对每个偏移量(1到N)计算百分比变化,组合成新的DataFrame
result = pd.concat(
    [1 - df['Data'].shift(i)/df['Data'] for i in range(1, N+1)],
    axis=1,
    keys=cols
)

# 合并原数据与结果
final_df = pd.concat([df, result], axis=1)

运行后final_df的结果为:

Data         A         B         C         D
0   100       NaN       NaN       NaN       NaN
1   103       NaN       NaN       NaN       NaN
2   104       NaN       NaN       NaN       NaN
3   106       NaN       NaN       NaN       NaN
4   110  0.036364  0.054545  0.063636  0.090909
5   115  0.078261  0.043478  0.060870  0.104348
6   120  0.041667  0.095652  0.053571  0.066667

逻辑说明

  • df['Data'].shift(i):将数据向上偏移i行,得到当前行上方第i行的值
  • 1 - 偏移后的值/当前值:按需求计算百分比变化(等价于(当前值-偏移值)/当前值)
  • pd.concat:将每个偏移量计算出的Series合并为多列的DataFrame,指定列名为A到D

这种方法利用Pandas的向量化操作,比逐行循环效率高很多,适合处理大规模数据集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 14:27:29