在
SAS
中,Proc Standard允许用户将数据标准化为特定组的特定均值和标准差。
在这里,我想将每个姓氏的年龄标准化为 mean = 0
和 deviation =5
。我怎样才能在 Pandas 中做到这一点df
?
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
按照 stats.stackexchange 的这个答案(将数据转换为所需平均值和标准差),我们可以定义一个函数来执行此操作:
def standard(x, mean, std):
x_std = mean + (x-x.mean()) * std/x.std()
return x_std
现在我们可以将它作为 lambda 函数应用于 df:
df = pd.DataFrame({'surname': ['Lim', 'Lim', 'Tan', 'Tan'],
'name': ['John', 'David', 'Mary', 'Tom'],
'age': [25, 100, 50, 30]
}
)
df_std = df.groupby('surname')['age'].apply(lambda x: standard(x, 0, 5))
surname
Lim 0 -3.535534
1 3.535534
Tan 2 3.535534
3 -3.535534
我们可以确认这一点:
df_std.groupby('surname').mean() # Should be 0
df_std.groupby('surname').std() # Should be 5