为列B的每个值添加列A的平均值

时间:2015-11-16 01:25:41

标签: python pandas

假设您有以下pandas数据框(df):

       A    B   C 
0      2    1   4
1      3    4   5
2      3    1   1
3      1    4   0 
4      5    0   1 

并且您希望为列B的每个不同值添加包含列A的平均值(或任何其他聚合函数)的列。您希望保留所有列。所以结果看起来像这样(df_result):

       A    B   C   meanA_givenB
0      2    1   4        (2+3)/2
1      3    4   5        (3+1)/2
2      3    1   1        (2+3)/2
3      1    4   0        (3+1)/2
4      5    0   1          5  /1

我这样做的方法如下:

import pandas as pd

meanA_givenB = df.groupby('B').A.mean()
df_result = pd.merge(df, pd.DataFrame(meanA_givenB), 
                     how='left', left_on='A', right_index=True,
                     suffixes=['','_meanA_givenB'])

必须有一种更清洁,更有效的方法。

1 个答案:

答案 0 :(得分:4)

您可以使用transform

>>> df['avg(A)|B'] = df.groupby('B')['A'].transform('mean')
>>> df
   A  B  C  avg(A)|B
0  2  1  4       2.5
1  3  4  5       2.0
2  3  1  1       2.5
3  1  4  0       2.0
4  5  0  1       5.0