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

时间:2018-08-30 19:13:14

标签: python pandas

我有一个df:

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

我正在尝试获取amt列的计数,总和,均值和唯一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 个答案:

答案 0 :(得分:5)

aggnunique一起使用。您不必强迫将列表传递给agg,它也需要字典映射,这就是这里所需要的。

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