Pandas:按每个组中的最大值分组并排序组

4

我有一个Pandas数据框,包含音轨、得分和其他列。

我想按“音轨”对其进行分组,然后基于“得分”的最大值对这些组进行排序。

示例数据框:

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()

我也尝试使用有序字典,但是它暂时没有用(至少现在还没有),因为groupBy命令正在发送错误顺序的数据。

Pandas = 0.23,Python = 3.6.4

2个回答

5

通过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

你是一位Pandas大神。你已经回答了我无数个关于Pandas的问题! - gosuto

2
可能会有点长,但这是我使用的方法:
首先设置索引:
df.set_index(['x', 'y'], inplace=True)

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


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

这将仅显示最大值,如果您想查看所有值,请删除“head(1)”。原始回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接