Pandas: Creando una columna agregada en DataFrame

Con el DataFrame a continuación como ejemplo,

In [83]: df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)}) df Out[83]: AB values 0 1 1 10 1 1 2 15 2 2 1 20 3 2 2 25 

¿Cuál sería una forma sencilla de generar una nueva columna que contenga cierta agregación de los datos en una de las columnas?

Por ejemplo, si sumo values sobre elementos en A

 In [84]: df.groupby('A').sum()['values'] Out[84]: A 1 25 2 45 Name: values 

Como puedo conseguir

  AB values sum_values_A 0 1 1 10 25 1 1 2 15 25 2 2 1 20 45 3 2 2 25 45 

 In [20]: df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)}) In [21]: df Out[21]: AB values 0 1 1 10 1 1 2 15 2 2 1 20 3 2 2 25 In [22]: df['sum_values_A'] = df.groupby('A')['values'].transform(np.sum) In [23]: df Out[23]: AB values sum_values_A 0 1 1 10 25 1 1 2 15 25 2 2 1 20 45 3 2 2 25 45 

Encontré una manera de usar join :

 In [101]: aggregated = df.groupby('A').sum()['values'] aggregated.name = 'sum_values_A' df.join(aggregated,on='A') Out[101]: AB values sum_values_A 0 1 1 10 25 1 1 2 15 25 2 2 1 20 45 3 2 2 25 45 

¿Alguien tiene una forma más sencilla de hacerlo?

Esto no es tan directo, pero lo encontré muy intuitivo (el uso del mapa para crear nuevas columnas a partir de otra columna) y se puede aplicar a muchos otros casos:

 gb = df.groupby('A').sum()['values'] def getvalue(x): return gb[x] df['sum'] = df['A'].map(getvalue) df 
 In [15]: def sum_col(df, col, new_col): ....: df[new_col] = df[col].sum() ....: return df In [16]: df.groupby("A").apply(sum_col, 'values', 'sum_values_A') Out[16]: AB values sum_values_A 0 1 1 10 25 1 1 2 15 25 2 2 1 20 45 3 2 2 25 45