基于Pandas v0.24.2与Python3.7实现按score排序并按parentid分组的技术咨询
解决方案:按组优先级(组内最高Score)排序,组内再按Score降序排列
我完全懂你的需求——你要的不是先分组再各自排序,而是先全局找出Score最高的那条记录所属的组,把整个组的所有记录按Score降序排在一起;接着在剩下的数据里找Score最高的记录,再把它所属的组按同样方式排好,以此类推。
实现思路
核心是给每个记录标记它所属组的最高Score,这样排序时:
- 先按「组的最高Score」降序,确保优先级高的组整体排在前面
- 再按「自身Score」降序,组内成员按Score从高到低排列
适配Pandas 0.24.2的代码
假设你的DataFrame名为df,执行以下步骤:
# 1. 给每条记录添加所属组的最高Score(用transform保证每条记录都能拿到对应组的最大值) df['group_max_score'] = df.groupby('parentid')['score'].transform('max') # 2. 先按组最高Score降序,再按自身Score降序排序 sorted_df = df.sort_values(by=['group_max_score', 'score'], ascending=[False, False]) # 3. 移除临时添加的列(可选,根据需求保留) sorted_df = sorted_df.drop(columns=['group_max_score'])
验证结果
用你提供的示例数据运行后,得到的结果完全符合你的预期:
| cid | parentid | score |
|---|---|---|
| 1000 | 100 | 2000 |
| 11 | 100 | 1000 |
| 100 | 100 | 200 |
| 12 | 100 | 100 |
| 3 | 10 | 1001 |
| 1 | 10 | 1000 |
| 2 | 10 | 100 |
| 10 | 10 | 20 |
| 112 | 1000 | 100 |
| 111 | 1000 | 10 |
为什么这个方法可行?
transform('max')会把每个parentid组的最高Score赋值给该组的每一条记录,这样排序时,同一组的所有记录会因为group_max_score相同而被归为一组,同时组的顺序由这个最大值决定(全局从高到低),组内再按自身Score排序,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Tereanoch
相关产品推荐
相关产品推荐

