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

Pandas计算各列相对固定列pct_change替换原列值结果全NaN问题

问题根因

原代码运行后全为NaN是两个逻辑错误导致的:

  • 循环按列顺序遍历,第一个处理的就是参考列A,第一次迭代就把原始A列的数值覆盖成了pct_change的计算结果,后续B/C/D列计算时参考基准已经丢失,分母为0直接产生NaN/无效值。
  • pct_change(axis=1)的原生逻辑是计算同一行内相邻前一列的变化率,并非固定和指定参考列做对比,靠传入两列子集凑结果的写法容错性极低,列顺序变动、中途列修改都会直接导致结果错误。
基于transform的正确实现

固定参考列的百分比变化计算公式非常明确:(当前列值 - 参考列A值) / 参考列A值,用transform可以一次性完成所有列的计算,不需要写循环,也不会出现计算过程中覆盖原始值的问题,完全符合预期要求:

  • A列保留原始值
  • B/C/D列为各自相对A列的百分比变化

代码如下:

from pandas import DataFrame
from numpy import random

# 固定随机种子方便复现结果,随机数最小值设为1避免除0异常
random.seed(42)
df = DataFrame(random.randint(1, 100, size=(100, 4)), columns=list('ABCD'))
print("原始数据预览:")
print(df.head())

# 逐列应用transform计算
df = df.transform(
    lambda col: col if col.name == "A" else (col - df["A"]) / df["A"]
)

print("计算结果预览:")
print(df.head())

提示:如果参考列A存在0值,直接计算会触发除0错误,可提前将0值替换为极小值、或过滤对应行后再做计算。

如果不想用lambda表达式,也可以写更易读的普通函数传入transform,逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:15:41