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

如何用Pandas实现SAS Proc Standard的分组标准化(均值0,标准差5)

在Pandas中实现SAS Proc Standard的分组标准化需求

需求说明

在SAS中,PROC STANDARD支持按指定分组将数据标准化为自定义的均值和标准差。现在需要实现:基于Pandas DataFrame(df)中的姓氏(surname)分组,将年龄(age)列标准化为均值=0、标准差=5的形式。


SAS参考代码与输出

SAS示例代码

data mydata;
input surname $ name $ age ;
datalines;
Lim John 25 
Lim David 100 
Tan Mary 50 
Tan Tom 30 ;
run;

PROC STANDARD MEAN=0 STD=5 DATA=mydata OUT=mydata11;
VAR age;
BY surname; 
run;

SAS输出结果

surname name    age
Lim John    -3.535533906
Lim David   3.5355339059
Tan Mary    3.5355339059
Tan Tom -3.535533906

Pandas实现方案

核心逻辑是按surname分组后,对每个分组的age先做Z-score标准化,再缩放至目标标准差、平移至目标均值,公式为:

标准化后的值 = ((原始值 - 分组均值) / 分组标准差) * 目标标准差 + 目标均值

对应代码如下:

import pandas as pd

# 构造示例DataFrame(与SAS示例数据一致)
data = {
    'surname': ['Lim', 'Lim', 'Tan', 'Tan'],
    'name': ['John', 'David', 'Mary', 'Tom'],
    'age': [25, 100, 50, 30]
}
df = pd.DataFrame(data)

# 定义分组标准化函数
def standardize_col(group, target_mean=0, target_std=5):
    group_mean = group.mean()
    group_std = group.std()
    return ((group - group_mean) / group_std) * target_std + target_mean

# 按姓氏分组,对年龄列应用标准化
df['age'] = df.groupby('surname')['age'].transform(standardize_col)

# 查看结果
print(df)

执行结果

输出与SAS完全匹配:

surname    name       age
0     Lim    John -3.535534
1     Lim   David  3.535534
2     Tan    Mary  3.535534
3     Tan     Tom -3.535534

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:33:12