Pandas GroupBy 和计算 Z-Score

JSo*_*ulp 8 python pandas

所以我有一个看起来像这样的数据框:

pd.DataFrame([[1, 10, 14], [1, 12, 14], [1, 20, 12], [1, 25, 12], [2, 18, 12], [2, 30, 14], [2, 4, 12], [2, 10, 14]], columns = ['A', 'B', 'C'])

    A   B   C
0   1   10  14
1   1   12  14
2   1   20  12
3   1   25  12
4   2   18  12
5   2   30  14
6   2   4   12
7   2   10  14
Run Code Online (Sandbox Code Playgroud)

我的目标是获得 B 列的 z 分数,相对于 A 列和 C 列的组。我知道我可以计算每组的均值和标准差

test.groupby(['A', 'C']).mean()    
        B
A   C   
1   12  22.5
    14  11.0
2   12  11.0
    14  20.0

test.groupby(['A', 'C']).std()
        B
A   C   
1   12  3.535534
    14  1.414214
2   12  9.899495
    14  14.142136
Run Code Online (Sandbox Code Playgroud)

现在,对于列 BI 中的每个项目,都希望根据这些均值和标准差计算其 z 分数。所以第一个结果是 (10 - 11) / 1.41。我觉得必须有一种方法可以在没有太多复杂性的情况下做到这一点,但我一直在思考如何进行。让我知道是否有人可以指出我正确的方向,或者我是否需要澄清任何事情!

WeN*_*Ben 9

transform

Mean=test.groupby(['A', 'C']).B.transform('mean')    
Std=test.groupby(['A', 'C']).B.transform('std')
Run Code Online (Sandbox Code Playgroud)

然后

(test.B - Mean) / Std
Run Code Online (Sandbox Code Playgroud)

一个函数zscore来自scipy

from scipy.stats import zscore
test.groupby(['A', 'C']).B.transform(lambda x : zscore(x,ddof=1))
Out[140]: 
0   -0.707107
1    0.707107
2   -0.707107
3    0.707107
4    0.707107
5    0.707107
6   -0.707107
7   -0.707107
Name: B, dtype: float64
Run Code Online (Sandbox Code Playgroud)

好的 显示我的号码绑定 hehe

(test.B - Mean) / Std ==test.groupby(['A', 'C']).B.transform(lambda x : zscore(x,ddof=1))
Out[148]: 
0    True
1    True
2    True
3    True
4    True
5    True
6    True
7    True
Name: B, dtype: bool
Run Code Online (Sandbox Code Playgroud)