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

如何在Pandas指定列上正确应用zscore函数?

Pandas计算指定列Z-score的问题解决

问题背景

现有如下Pandas DataFrame:

DATE        value1      value2      value3      value4
0   2020-01-06  1432.474761 96.215891   1488.882633 96.015154
1   2020-01-07  1023.868069 97.645627   1054.100066 97.536370
2   2020-01-08  837.560896  98.281260   788.085172  98.445618
3   2020-01-09  1351.789373 96.560701   1800.800979 95.025800
4   2020-01-10  1102.373631 97.430358   991.444011  97.799854

需求为给各数值列计算Z-score,目前删除DATE列后可通过apply(zscore)正常运行:

from scipy.stats import zscore
df.drop(columns=["DATE"])
df.apply(zscore)

但单独选择某列(如value1)执行df["value1"].apply(zscore)时,会报错:

AxisError: axis 0 is out of bounds for array of dimension 0

解决方案

1. 直接用zscore处理Series(推荐)

zscore本身可以直接接收Pandas Series作为输入,不需要用apply,这是最简单的方式:

from scipy.stats import zscore
# 给value1列计算Z-score并新增列存储
df["value1_zscore"] = zscore(df["value1"])

2. 批量处理指定数值列(不删除DATE列)

如果要给多个数值列批量计算,无需删除DATE列,直接指定目标列即可:

# 方式1:筛选所有以value开头的列
value_cols = [col for col in df.columns if col.startswith("value")]
df[value_cols] = df[value_cols].apply(zscore)

# 方式2:直接指定列名列表
target_cols = ["value1", "value2", "value3", "value4"]
df[target_cols] = df[target_cols].apply(zscore)

3. 用apply配合raw=True参数(仅作演示)

如果一定要用apply处理单个Series,需要添加raw=True参数,让Pandas把整个Series作为numpy数组传递给zscore,而不是逐个元素传入:

df["value1_zscore"] = df["value1"].apply(zscore, raw=True)

报错原因说明

单独执行df["value1"].apply(zscore)报错,是因为apply默认会把Series中的每个元素单独传给zscore,而zscore需要处理的是一维数组,不是单个数值,因此触发维度不匹配的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 12:59:14