首页 > 解决方案 > 如何在一个列上进行分组,同时在整个数据框中按另一列排序

问题描述

我有一个看起来像这样的数据框:

   id    total
   1     50
   1     0
   1     0
   2     100
   2     0
   2     0
   3     75
   3     0
   3     0

但我需要它按总数降序排序,同时保持按id分组的行。像这样:

   id    total
   2     100
   2     0
   2     0
   3     75
   3     0
   3     0
   1     50
   1     0
   1     0

我尝试了一些使用 groupby 的建议,如下所示:

grouped = df.groupby('id').apply(lambda g: g.sort_values('total', ascending=False))

看起来它正在做的是按升序对id进行分组和排序,然后对每个分组id中的总数进行子排序。但我需要它对总数中的所有行进行排序,同时保持按id分组的行

任何建议,将不胜感激。

标签: pythonpandas

解决方案


这是一种使用.groupby(),.list().explode()

>>> df
   id  total
0   1     50
1   1      0
2   1      0
3   2    100
4   2      0
5   2      0
6   3     75
7   3      0
8   3      0
>>> df.sort_values('total', ascending=False).groupby('id', sort=False).agg(list).explode('total').reset_index()
   id total
0   2   100
1   2     0
2   2     0
3   3    75
4   3     0
5   3     0
6   1    50
7   1     0
8   1     0

这个想法首先按total降序对列进行排序。然后,按id列对其进行分组,而不对分组索引进行排序。接下来,将list()函数.agg()作为参数传递给。最后,.explode()total列上使用。


推荐阅读