按对象求和一组值

时间:2019-04-28 20:30:50

标签: python pandas sum

我遇到一些熊猫groupby对象问题,如下所示:

所以我有这个数据框:

  Letter name    num_exercises
    A       carl        1 
    A       Lenna       2 
    A       Harry       3         
    A       Joe         4  
    B       Carl        5    
    B       Lenna       3   
    B       Harry       3  
    B       Joe         6 
    C       Carl        6
    C       Lenna       3 
    C       Harry       4  
    C       Joe         7  

我想在其上添加一个名为num_exercises_total的列,其中包含每个字母的num_exercises的总和。请注意,字母组中的每一行都必须重复此值。

输出如下:

Letter name    num_exercises   num_exercises_total
A       carl        1                 15
A       Lenna       2                 15
A       Harry       3                 15
A       Joe         4                 15
B       Carl        5                 18
B       Lenna       3                 18
B       Harry       3                 18
B       Joe         6                 18
C       Carl        6                 20
C       Lenna       3                 20
C       Harry       4                 20
C       Joe         7                 20

我已经尝试过像这样添加新列:

df['num_exercises_total'] = df.groupby(['letter'])['num_exercises'].sum()

但是它为所有行返回值NaN

任何帮助将不胜感激。

非常感谢您!

2 个答案:

答案 0 :(得分:4)

您可能要检查transform

df.groupby(['Letter'])['num_exercises'].transform('sum')
0     10
1     10
2     10
3     10
4     17
5     17
6     17
7     17
8     20
9     20
10    20
11    20
Name: num_exercises, dtype: int64

df['num_of_total']=df.groupby(['Letter'])['num_exercises'].transform('sum')

答案 1 :(得分:0)

转换非常适合此问题。 WenYoBen是正确的。我只是在这里放些不同的版本。

df['num_of_total']=df['num_excercises'].groupby(df['Letter']).transform('sum')
>>> df
   Letter   name  num_excercises  num_of_total
0       A   carl               1            10
1       A  Lenna               2            10
2       A  Harry               3            10
3       A    Joe               4            10
4       B   Carl               5            17
5       B  Lenna               3            17
6       B  Harry               3            17
7       B    Joe               6            17
8       C   Carl               6            20
9       C  Lenna               3            20
10      C  Harry               4            20
11      C    Joe               7            20