Josef
is this what you are after? This is quite fast.
In [10]: np.random.seed(1234)
In [11]: df = DataFrame({'A' : np.random.randint(0,10,size=100), 'B' : np.random.randn(100)})
In [12]: df['C'] = df['B']-df.groupby('A')['B'].transform('mean')
In [13]: df.head()
Out[13]:
A B C
0 3 0.299347 0.412738
1 6 0.127277 0.161831
2 5 0.926190 0.838768
3 4 2.455240 1.855498
4 8 -0.320890 0.129203
In [14]: df[df.A==3]
Out[14]:
A B C
0 3 0.299347 0.412738
21 3 -0.063758 0.049633
26 3 -1.000889 -0.887498
28 3 0.159520 0.272911
30 3 0.028340 0.141731
32 3 -0.712358 -0.598967
51 3 -0.288721 -0.175330
60 3 0.418900 0.532291
99 3 0.139099 0.252490
In [15]: df[df.A==3].B.mean()
Out[15]: -0.11339119534010732