计算含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
相关产品推荐
相关产品推荐

