首页 > 解决方案 > 从 pandas groupby 获得独特的价值记录

问题描述

我有一个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

标签: pythonpandas

解决方案


agg与 一起使用nunique。您不必将列表传递给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

推荐阅读