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

如何让Pandas的pct_change()函数实现首尾循环的百分比变化计算

如何让Pandas的pct_change()函数实现首尾循环的百分比变化计算

我懂你想要的效果——让pct_change()的计算首尾循环起来,不再让第一个位置留空(NaN),而是用上最后一行和第一行的数值来计算变化率对吧?

先看看你给出的示例数据:

import pandas as pd

df = pd.DataFrame({'Month':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
                   'Value':[1, 0.9, 0.8, 0.75, 0.75, 0.8, 0.7, 0.65, 0.7, 0.8, 0.85, 0.9]})

默认用pct_change() + 1的话,第一行确实会得到NaN,因为没有前一个值可以参考。要实现首尾循环的效果,有两种简单的做法:

方法一:手动替换NaN值

先按常规方式计算百分比变化,然后把第一行的NaN替换成第一行Value除以最后一行Value的结果(这正好对应首尾循环的变化比例):

# 常规计算百分比变化(+1后得到当前值/前一个值的比例)
df['percent change'] = df['Value'].pct_change() + 1
# 替换第一行的NaN为首尾的比例
df['percent change'].iloc[0] = df['Value'].iloc[0] / df['Value'].iloc[-1]

执行后第一行的percent change就会变成1.0 / 0.9 ≈ 1.111111,完美实现循环计算。

方法二:拼接尾部值后计算

我们可以把原数据的最后一行Value拼到整个序列的最前面,然后计算pct_change,再取后面的部分:

# 把最后一个值放到序列开头
temp_series = pd.concat([df['Value'].tail(1), df['Value']], ignore_index=True)
# 计算pct_change并+1,然后去掉第一个临时值对应的结果
df['percent change'] = temp_series.pct_change().iloc[1:] + 1

这种方法不需要手动处理NaN,本质上是给第一行“伪造”了一个前序值(也就是原数据的最后一个值),计算出来的结果和方法一完全一致。

两种方法都能实现你要的首尾循环效果,选哪种都可以~

备注:内容来源于stack exchange,提问作者Emi OB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 15:29:34