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

