2015-10-30 5 views
2

У меня есть DataFrameПанда новый столбец из 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 

и хочет создать новый столбец, средний результат для соответствующих значений для «а» и «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 

Я мог бы сделать это с помощью цикла через комбинацию «а» и «б», но что бы получить очень медленно и громоздким для больших наборов данных. Вероятно, есть намного более простой и быстрый способ.

ответ

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

Смежные вопросы