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

