代码之家  ›  专栏  ›  技术社区  ›  ahajib Shaun McHugh

Python pandas:同时在不同列上进行平均和求和分组

  •  35
  • ahajib Shaun McHugh  · 技术社区  · 7 年前

    我有一个熊猫数据框,如下所示:

    Name    Missed    Credit    Grade
    A       1         3         10
    A       1         1         12      
    B       2         3         10
    B       1         2         20
    

    我想要的输出是:

    Name    Sum1   Sum2    Average
    A       2      4      11
    B       3      5      15   
    

    基本上是为了得到列的和 Credit Missed 平均而言 Grade . 我现在正在做的是两个groupby on Name 然后求和和和平均值,最后合并两个输出数据帧,这似乎不是最好的方法。我还发现这一点,如果我只想在一个专栏上工作,这是有意义的:

    df.groupby('Name')['Credit'].agg(['sum','average'])
    

    但不知道如何为两个柱都做一个内衬?

    2 回复  |  直到 7 年前
        1
  •  71
  •   jezrael    4 年前

    你需要 agg 通过 dictionary 然后 rename 列名称:

    d = {'Missed':'Sum1', 'Credit':'Sum2','Grade':'Average'}
    df=df.groupby('Name').agg({'Missed':'sum', 'Credit':'sum','Grade':'mean'}).rename(columns=d)
    print (df)
          Sum1  Sum2  Average
    Name                     
    A        2     4       11
    B        3     5       15
    

    如果需要,还可以从中创建列 Name :

    df = (df.groupby('Name', as_index=False)
           .agg({'Missed':'sum', 'Credit':'sum','Grade':'mean'})
           .rename(columns={'Missed':'Sum1', 'Credit':'Sum2','Grade':'Average'}))
    print (df)
      Name  Sum1  Sum2  Average
    0    A     2     4       11
    1    B     3     5       15
    

    具有命名聚合的解决方案:

    df = df.groupby('Name', as_index=False).agg(Sum1=('Missed','sum'), 
                                                Sum2= ('Credit','sum'),
                                                Average=('Grade','mean'))
    print (df)
      Name  Sum1  Sum2  Average
    0    A     2     4       11
    1    B     3     5       15
    
        2
  •  3
  •   BENY    7 年前
    A = pd.DataFrame.from_dict({'Name':['A','A','B','B'],'Missed':[1,1,2,1],'Credit':[3,1,3,2],'Grades':[10,12,10,20]})
    
    A.groupby('Name').agg({'Missed':'sum','Credit':'sum','Grades':'mean'})