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

计算含NaN的pct_change时如何避免bfill或ffill填充

如何在pct_change计算中保留NaN(不自动填充)

问题场景

现有如下数据:

import numpy as np
import pandas as pd

price = [np.NaN, 10, 13, np.NaN, np.NaN, 9]
df = pd.DataFrame(price, columns=['price'])

数据输出:

price
0 NaN
1 10.0
2 13.0
3 NaN
4 NaN
5 9.0

使用pct_change()计算滚动百分比变化时,无论指定fill_method='bfill'、'pad'还是'ffill',都会先填充NaN再计算,得到不符合预期的结果。例如:

df.price.pct_change(periods=1, fill_method='pad')

输出:

0 NaN
1 NaN
2 0.300000
3 0.000000
4 0.000000
5 -0.307692
Name: price, dtype: float64

我们需要的是遇到NaN时结果仍为NaN,预期输出:

0 NaN
1 NaN
2 0.300000
3 NaN
4 NaN
5 NaN
Name: price, dtype: float64

解决方案

方法1:使用fill_method=None(推荐,pandas 1.3.0+)

从pandas 1.3.0版本开始,pct_change支持fill_method=None参数,设置后会跳过NaN填充步骤,仅当当前行和对比行都为非空值时才计算变化率:

df.price.pct_change(periods=1, fill_method=None)

执行后直接得到预期结果。

方法2:手动计算(兼容旧版本pandas)

如果你的pandas版本低于1.3.0,可以手动实现百分比变化的计算逻辑:

df['pct_change'] = (df['price'] / df['price'].shift(1)) - 1

通过shift(1)获取前一行的值,只有当当前值和前一行值都非空时,除法运算才会得到有效结果,否则返回NaN,最终结果与预期一致。


内容的提问来源于stack exchange,提问作者ah bon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:55:32