如何在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
相关产品推荐
相关产品推荐

