对于Python中的数据框(请参见下文),我想使用S元素所属的G组的均值和标准偏差来计算S的z得分,即S的s属于a G组g

s_z = (s - mu(g))/sigma(g).


最优雅的方法是什么?

    G         S
0   B  0.444939
1   D  0.407554
2   C  0.460148
3   B  0.465239
4   A  0.462691
5   A  0.016545
6   D  0.850445
7   C  0.817744
8   B  0.777962
9   C  0.757983
10  C  0.934829

最佳答案

我认为您需要具有lambda函数的groupby-与meanstd或通过scipy.stats.zscore,仅需要更改默认值ddof

from  scipy.stats import zscore

df['s_z'] = df.groupby('G')['S'].transform(lambda x: (x-x.mean())/x.std())
df['s_z1'] = df.groupby('G')['S'].transform(lambda x: zscore(x, ddof=1))
print (df)
    G         S       s_z      s_z1
0   B  0.444939 -0.630865 -0.630865
1   D  0.407554 -0.707107 -0.707107
2   C  0.460148 -1.397499 -1.397499
3   B  0.465239 -0.522127 -0.522127
4   A  0.462691  0.707107  0.707107
5   A  0.016545 -0.707107 -0.707107
6   D  0.850445  0.707107  0.707107
7   C  0.817744  0.371317  0.371317
8   B  0.777962  1.152993  1.152993
9   C  0.757983  0.075715  0.075715
10  C  0.934829  0.950467  0.950467

08-19 23:49