如何按Year分组后对DataFrame按Counts列降序排序?
问题
我有如下DataFrame:
Names Counts Year 0 Jordan 1043 2000 1 Steve 204 2000 2 Brock 3 2000 3 Steve 33 2000 4 Mike 88 2000 ... ... ... ... 20001 Bryce 2 2015 20002 Steve 11 2015 20003 Penny 24 2015 20004 Steve 15 2015 20005 Ryan 5 2015
我希望按Year对数据分组,再按Counts列降序排序,预期输出示例如下:
Names Counts Year 0 Jordan 1043 2000 1 Steve 204 2000 2 Mike 88 2000 3 Steve 33 2000 4 Brock 3 2000 ... ... ... ... 20001 Penny 24 2015 20002 Steve 15 2015 20003 Steve 11 2015 20004 Ryan 5 2015 20005 Bryce 2 2015
我已尝试的代码:
df = (df[df['Names'].groupby('Year').sort_values(by=['Counts'], ascending=False)
解决方案
你写的代码存在两个问题:一是语法不完整(缺少闭合括号),二是逻辑有误——df['Names'].groupby('Year')仅对Names列按年份分组,没法直接基于Counts列做组内排序。
要实现需求,推荐两种方法:
方法一:分组后组内排序
通过groupby结合apply,对每个年份分组的数据单独按Counts降序排列:
df = df.groupby('Year', group_keys=False).apply(lambda x: x.sort_values('Counts', ascending=False))
参数group_keys=False可以避免结果中额外生成分组键的索引层级。
方法二:全局排序(性能更优)
先按Year升序、Counts降序做全局排序,再重置索引,最终效果和分组排序一致,且这种方法不需要对每个分组单独处理,运行效率更高:
df = df.sort_values(['Year', 'Counts'], ascending=[True, False]).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Rashid Abramov
相关产品推荐
相关产品推荐

