我正在研究如何使用 pandas pct_change() 函数,但我需要值“环绕”,因此最后一个值和第一个值在位置 0 而不是 NaN 创建百分比变化值。
例如:
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]})
Month Value
0 1 1.00
1 2 0.90
2 3 0.80
3 4 0.75
4 5 0.75
5 6 0.80
6 7 0.70
7 8 0.65
8 9 0.70
9 10 0.80
10 11 0.85
11 12 0.90
使用 pct_change() + 1 可得出:
df['percent change'] = df['Value'].pct_change() + 1
Month Value percent change
0 1 1.00 NaN
1 2 0.90 0.900000
2 3 0.80 0.888889
3 4 0.75 0.937500
4 5 0.75 1.000000
5 6 0.80 1.066667
6 7 0.70 0.875000
7 8 0.65 0.928571
8 9 0.70 1.076923
9 10 0.80 1.142857
10 11 0.85 1.062500
11 12 0.90 1.058824
但是我还需要知道 12 月(moth=12)和 1 月(month=1)之间的百分比变化,因此 NaN 应该是 1.111111。我希望最终能够对分组中的多个组执行此操作,因此,将 Nan 填入一个值而不是另一个值,或者手动计算所有百分比似乎是一种冗长的方法。有没有更简单的方法来实现这一点?
为了在 Pandas 中实现所需的“环绕”行为
pct_change()
,您可以通过临时移动值来修改 DataFrame,然后NaN
用最后一个值和第一个值之间的百分比变化填充第一个位置。这是代码。
这也可以适用
groupby()
。我希望这对你有一点帮助。
太长不看;
解释
pandas
Series.pct_change
是 performing 的薄包装器Series / Series.shift(...)
。事实证明,它Series.pct_change
会将无关的关键字参数转发到Series.shift(...)
,并且此方法采用fill_value
关键字参数来填充移位操作产生的 NaN 值。然后在执行之后计算百分比变化值.shift
考虑到以上情况,我们可以简单地指定
Series.pct_shift(..., fill_value={last row of Series})
只需使用专
numpy.roll
为此特定目的而设计的:输出:
如果需要按组执行此操作,请将其与以下内容结合
groupby.transform
:输出: