[英]Get the max value from each group with pandas.DataFrame.groupby
[英]Pandas: GroupBy and Order Groups based on max value in each group
我有一個Pandas DataFrame,其中包含音軌,樂譜和其他一些列。
我想按“曲目”分組,然后根據“得分”上的最大值對這些分組進行排序。
示例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
通過創建輔助柱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
可能有點長,但這是我使用的:
首先設置索引:
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)”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.