熊猫:根据每个组中的最大值进行分组并按顺序分组

时间:2019-03-14 08:08:21

标签: python pandas

我有一个Pandas DataFrame,其中包含曲目,乐谱和其他一些列。

我想按“曲目”分组,然后根据“得分”上的最大值对这些分组进行排序。

示例数据框架

tracks       score
20            2.2
20            1.5
25            3.5
24            1.2
24            5.5

期望的输出(我不想比较任何其他数据,但我想比较每个组中的最高值,并按从高到低的顺序对所有组进行排序-表示我想显示所有行):

tracks       score
24            5.5
              1.2
25            3.5
20            2.2
              1.5

当前,我得到以下输出(我的乐谱已排序,但根据曲目编号对我的曲目分组后):

    tracks       score
20            2.2
              1.5
24            5.5
              4.2
25            3.5

到目前为止,我的方法: 1.我已经按照分数对所有值进行了排序

sub_df = sub_df.sort_values("score")
  1. 然后我正在执行以下操作以获取输出(我需要以字典格式):

url_dict = sub_df.groupby('track')['url'].apply(list).to_dict()

我还尝试使用OrderedDict,但是(直到现在为止)它没有用,因为groupBy命令发送的数据序列错误。

熊猫= 0.23,Python = 3.6.4

2 个答案:

答案 0 :(得分:3)

通过GroupBy.transform创建帮助者列,并通过DataFrame.sort_values按多列排序,最后删除帮助者列:

sub_df['max'] = sub_df.groupby('tracks')['score'].transform('max')

sub_df = sub_df.sort_values(["max","score"], ascending=False).drop('max', axis=1)
#if necessary sorting also by tracks column
#sub_df = sub_df.sort_values(["max","tracks","score"], ascending=False).drop('max', axis=1)
print (sub_df)
   tracks  score
4      24    5.5
3      24    1.2
2      25    3.5
0      20    2.2
1      20    1.5

答案 1 :(得分:2)

可能有点长,但这是我使用的:

首先设置索引:

df.set_index(['x', 'y'], inplace=True)

然后在基于索引的双重排序数据帧上使用分组依据

new_df = df.groupby(level=[0,1]).sum().reset_index() \
          .sort_values(['x', 'y'], ascending=[1,0]).groupby('x').head(1)

这将仅显示最大值,如果要查看全部,请删除“ head(1)”。