首页 > 解决方案 > 数据框 sort_values 选项

问题描述

尝试安排数据框

genres = ['classic', 'pop', 'classic', 'classic', 'pop', 'pop', 'rock', 'rap' , 'k' , 'k']
plays = [500, 600, 150, 800, 2500, 700, 300, 10000, 300, 400]


import pandas as pd
df = pd.DataFrame({'genres' : genres,
                   'plays' : plays,
                   'num' : list(range(0,len(genres)))})

df
    genres  plays  num
0  classic    500    0
1      pop    600    1
2  classic    150    2
3  classic    800    3
4      pop   2500    4
5      pop    700    5
6     rock    300    6
7      rap  10000    7
8        k    300    8
9        k    400    9
dfg = df.groupby('genres', as_index = False).sum().sort_values(by = 'plays' , ascending = False)

dfg
    genres  plays  num
3      rap  10000    7
2      pop   3800   10
0  classic   1450    5
1        k    700   17
4     rock    300    6
dfg1 = df.sort_values(by=['genres','plays'], 
                      ascending = [False, False]).groupby('genres').head(2)

dfg1

    genres  plays  num
6     rock    300    6
7      rap  10000    7
4      pop   2500    4
5      pop    700    5
9        k    400    9
8        k    300    8
3  classic    800    3
0  classic    500    0

我想要的 dfg1 是按 dfg 中显示的每个流派总和的总和来安排的,并且在每个流派中我想要最大的 2 个播放值。

但是,上面显示的表格安排得有些奇怪,我猜安排是由只有 1 个播放值和 2 个或更多播放值的不同组完成的,因为“摇滚”和“说唱”总是在表格的顶部,并且在有 2 个或更多戏剧的流派之后

    genres  plays  num
7      rap  10000    7
4      pop   2500    4
5      pop    700    5
3  classic    800    3
0  classic    500    0
9        k    400    9
8        k    300    8
6     rock    300    6

上面是我想要的表格,排列是由每组的总和完成的,并且在每组中我想要2个最大的播放值。

任何人都可以帮忙吗?

标签: pythonpandasdataframesorting

解决方案


用于df.merge符合您要排序的顺序:

In [773]: x = df.groupby('genres')['plays'].nlargest(2).reset_index()
In [779]: dfg1 = dfg.merge(x, on='genres')[['genres', 'plays_y', 'level_1']].rename(columns={'level_1':'num', 'plays_y': 'plays'})

In [780]: dfg1
Out[780]: 
    genres  plays  num
0      rap  10000    7
1      pop   2500    4
2      pop    700    5
3  classic    800    3
4  classic    500    0
5        k    400    9
6        k    300    8
7     rock    300    6

推荐阅读