直接用pct_change()计算相邻元素百分比变化,需确保索引单调递增、处理NaN和零值分母,并优先重采样对齐时间频率。

直接用 pct_change() 就行,但得注意索引和缺失值
在 Pandas DataFrame 或 Series 中,pct_change() 是计算相邻元素变化百分比最直接的方法。它默认按行方向(即沿索引)计算:(当前值 − 前一值) / 前一值。结果第一行总是 NaN,因为没有“前一值”可比。
常见错误是把数据没对齐就直接调用——比如时间序列没按时间排序、或索引乱序,会导致算出的百分比完全错位。务必先确认索引是单调递增的(尤其处理时间数据时用 df.sort_index() 或 df.sort_values('date'))。
-
pct_change()默认periods=1,即和上一行比;想和上 5 行比就写pct_change(periods=5) - 若列含
NaN,它会跳过并传播:前一行是NaN,当前行结果就是NaN;可用fill_method=None禁用插值(默认是'pad') - 对整列操作:直接
df['col'].pct_change();返回新 Series,不修改原数据
处理空值和边界情况必须显式干预
pct_change() 遇到首行、NaN、零值都会产出 NaN 或 inf。特别是分母为 0(比如前一值是 0),结果会是 inf 或 -inf,后续计算可能报错或污染统计结果。
- 用
replace([np.inf, -np.inf], np.nan)清洗无穷值 - 用
fillna(0)或ffill()填充首行NaN(但要清楚业务含义:首期变化率为 0 是否合理?) - 若原始列有缺失,先决定策略:删行(
dropna())、向前填充(ffill()),还是保留NaN让pct_change()自动跳过
按时间频率重采样后再算 pct_change 更可靠
原始数据若不是等间隔(比如股票日频数据里缺了节假日),直接 pct_change() 会把“隔了 3 天”当成“隔了 1 天”,导致百分比失真。这时候应该先用 resample() 对齐频率。
立即学习“Python免费学习笔记(深入)”;
例如日频数据想算周涨跌幅:
df.set_index('date').resample('W-FRI').last()['price'].pct_change()
这里 resample('W-FRI').last() 确保每周取最后一个交易日收盘价,再算周环比。不这么做,直接 pct_change() 可能拿周一和周二比,也可能拿周五和下周一比(中间缺三天),结果不可比。
- 时间列必须是
datetime64类型,否则resample报错 -
resample后记得用聚合方法(如last()、mean()),不然返回的是Resampler对象,不能直接调pct_change()
多列批量计算别用循环,用 axis 参数
如果要对多个数值列同时算变化率,别写 for 循环逐个调 pct_change()。DataFrame 支持直接传入 axis 参数:
df[['col_a', 'col_b', 'col_c']].pct_change(axis=0)
这比循环快,且保持列对齐。注意 axis=0(默认)是按行计算,axis=1 是按列计算(即每行内各列相比),后者极少用,容易混淆。
- 若只关心某几列,先切片再调用,避免对非数值列(如字符串 ID)触发类型错误
- 结果 DataFrame 的列名、索引与原切片一致,可直接赋值回原表:
df['pct_col_a'] = df['col_a'].pct_change()
pct_change() 会返回 inf,不检查的话,后续 mean() 或绘图全崩。


















