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

