代码之家  ›  专栏  ›  技术社区  ›  Matt W.

从熊猫groupby获得独特的价值记录

  •  1
  • Matt W.  · 技术社区  · 7 年前

    df = pd.DataFrame({'type':['a', 'a', 'b', 'b'],
                  'id':[1134, 5321, 2444, 2444],
                  'amt':[45, 55, 13, 14]})
    

    我正在尝试获取amt列的count、sum、mean和惟一id。

    df.groupby('type')['amt'].agg(['count', 'sum', np.mean])
    
          count  sum  mean
    type                  
    a         2  100  50.0
    b         2   27  13.5
    

    现在我正在尝试为每个分组获取不同的id。如果我加上 id 把柱子拉出来

            id                 amt           
         count   sum    mean count  sum  mean
    type                                     
    a        2  6455  3227.5     2  100  50.0
    b        2  4888  2444.0     2   27  13.5
    

    我不想要。我要第一张桌子,但要有明显的数字 另一个 列。我也试过下面的方法,但没有用。

    df.groupby('type')['amt'].agg(['count', 'sum', np.mean, lambda x: len(np.unique(x['id']))])
    

          count  sum  mean  unique_id
    type                  
    a         2  100  50.0  2
    b         2   27  13.5  1
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   user3483203    7 年前

    agg 具有 nunique . 您不必将列表传递给 阿格 ,它还需要一个字典映射,这是这里所需要的。

    res = df.groupby('type').agg({'amt': ['count', 'sum', 'mean'], 'id': 'nunique'})
    

           amt                 id
         count  sum  mean nunique
    type
    a        2  100  50.0       2
    b        2   27  13.5       1
    

    如果您想将列展平(我个人认为您应该保留它们,这样更易于索引):

    res.columns = res.columns.get_level_values(1)
    print(res)
    

          count  sum  mean  nunique
    type
    a         2  100  50.0        2
    b         2   27  13.5        1