Skip to main content
 首页 » 编程设计

python之从 pandas groupby 获取独特的值(value)记录

2025年05月04日21emanlee

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

请您参考如下方法:

将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