2015-10-30 192 views
2

我有一个数据帧大熊猫从GROUPBY平均新列

>>> df = pd.DataFrame({'a':[1,1,1,2,2,2], 
...     'b':[10,20,20,10,20,20], 
...     'result':[100,200,300,400,500,600]}) 
... 
>>> df 
    a b result 
0 1 10  100 
1 1 20  200 
2 1 20  300 
3 2 10  400 
4 2 20  500 
5 2 20  600 

,并希望创建一个新的列,它是为“A”和“B”的相应值的平均结果。我可以通过groupby获得这些值:

>>> df.groupby(['a','b'])['result'].mean() 
a b 
1 10 100 
    20 250 
2 10 400 
    20 550 
Name: result, dtype: int64 

但无法弄清楚如何将其转换为原始DataFrame中的新列。最后的结果应该是这样的,

>>> df 
    a b result avg_result 
0 1 10  100   100 
1 1 20  200   250 
2 1 20  300   250 
3 2 10  400   400 
4 2 20  500   550 
5 2 20  600   550 

我可以通过“A”和“B”的组合循环做到这一点,但会获得更大的数据集很慢和笨拙。可能有一种更简单快捷的方式。

回答

4

您需要transform

df['avg_result'] = df.groupby(['a','b'])['result'].transform('mean') 

这对你产生GROUPBY值的正确索引列:

a b result avg_result 
0 1 10  100   100 
1 1 20  200   250 
2 1 20  300   250 
3 2 10  400   400 
4 2 20  500   550 
5 2 20  600   550 
+0

完美,谢谢! – rurp