SAS的Proc Standard是用于数据标准化的过程,能够将指定变量的取值调整为用户设定的均值和标准差,常用于消除不同变量量纲差异对后续分析的影响。Pandas作为Python生态中主流的数据处理工具,同样可以灵活实现这类标准化逻辑。

SAS Proc Standard的核心逻辑
SAS Proc Standard的标准化公式如下:
新变量值 = (原变量值 - 原变量均值) / 原变量标准差 * 目标标准差 + 目标均值
其中目标均值和目标标准差由用户手动指定,若未指定则默认目标均值为0,目标标准差为1,此时就是常见的Z-score标准化。
Pandas实现标准化功能的步骤
1. 准备测试数据
首先构造一份和SAS中常用的测试数据集结构类似的DataFrame,方便后续对比效果:
import pandas as pd
import numpy as np
# 构造测试数据,包含id和两个需要标准化的数值变量
data = {
'id': [1, 2, 3, 4, 5],
'var1': [10, 20, 30, 40, 50],
'var2': [5, 15, 25, 35, 45]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
2. 实现通用标准化函数
根据SAS Proc Standard的公式,封装一个通用的标准化函数,支持指定目标均值和目标标准差:
def pandas_standardize(df, cols, target_mean=0, target_std=1):
"""
用Pandas实现SAS Proc Standard的标准化功能
:param df: 原始DataFrame
:param cols: 需要标准化的列名列表
:param target_mean: 目标均值,默认0
:param target_std: 目标标准差,默认1
:return: 标准化后的新DataFrame
"""
result_df = df.copy()
for col in cols:
# 计算原变量的均值和标准差
origin_mean = df[col].mean()
origin_std = df[col].std(ddof=0) # SAS默认使用总体标准差,ddof=0对应总体标准差
# 按公式计算标准化后的值
result_df[col] = (df[col] - origin_mean) / origin_std * target_std + target_mean
return result_df
3. 调用函数验证效果
分别测试默认标准化(目标均值0,目标标准差1)和自定义目标参数的场景:
# 场景1:默认标准化,目标均值0,目标标准差1
standardized_df1 = pandas_standardize(df, ['var1', 'var2'])
print("默认标准化后的数据:")
print(standardized_df1)
print("var1的均值:", standardized_df1['var1'].mean())
print("var1的标准差:", standardized_df1['var1'].std(ddof=0))
# 场景2:自定义目标均值10,目标标准差2
standardized_df2 = pandas_standardize(df, ['var1', 'var2'], target_mean=10, target_std=2)
print("n自定义目标参数标准化后的数据:")
print(standardized_df2)
print("var1的均值:", standardized_df2['var1'].mean())
print("var1的标准差:", standardized_df2['var1'].std(ddof=0))
注意事项
- SAS计算标准差时默认使用总体标准差(除以n),而Pandas的
std()方法默认除以n-1(样本标准差),因此需要指定ddof=0才能和SAS的结果一致。 - 如果原变量的标准差为0,会出现除零错误,实际使用时需要提前处理常数列,或者添加异常捕获逻辑。
- 若需要对多个数据集使用相同的标准化参数,可以先计算训练集的均值和标准差,再应用到测试集,避免数据泄露。
和SAS Proc Standard的对比
以下是两种工具实现方式的简单对比:
| 对比项 | SAS Proc Standard | Pandas实现 |
|---|---|---|
| 参数指定方式 | 过程步中直接指定MEAN=和STD=选项 | 函数参数中传入target_mean和target_std |
| 标准差计算逻辑 | 默认总体标准差 | 需手动指定ddof=0使用总体标准差 |
| 输出结果 | 直接生成新数据集 | 返回新的DataFrame对象 |
PandasSAS_Proc_Standard数据标准化均值标准差数据预处理修改时间:2026-07-09 07:00:22