我有一个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")
url_dict = sub_df.groupby('track')['url'].apply(list).to_dict()
我还尝试使用OrderedDict,但是(直到现在为止)它没有用,因为groupBy命令发送的数据序列错误。
熊猫= 0.23,Python = 3.6.4
答案 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)”。