如何按需求对Pandas DataFrame的元素进行排序与分组?
解决方案
首先纠正几个关键点:你的原代码里误用了列名(DataFrame中分组列是category而非group),且未处理同分数按时间升序、组间按组内最高分降序这两个核心需求。以下是完整实现步骤:
步骤1:转换时间列为datetime类型
时间列需要先转为可排序的datetime格式,否则字符串排序会出错:
df['time'] = pd.to_datetime(df['time'])
步骤2:生成组内最高分辅助列
通过groupby.transform为每行添加对应组的最高分,作为组间排序的依据:
df['group_max_score'] = df.groupby('category')['score'].transform('max')
步骤3:多维度排序
按「组内最高分降序 → 组内分数降序 → 时间升序」的优先级排序,最后删除辅助列:
df_sorted = df.sort_values( by=['group_max_score', 'score', 'time'], ascending=[False, False, True] ).drop('group_max_score', axis=1)
最终结果说明
排序后的数据顺序完全符合需求:
- 组间:C组(最高分5)→ A组(最高分5)→ B组(最高分4)
- 组内:
- A组:peter(5分)→ tom(3分,时间更早)→ nick(3分)
- B组:ewa(4分)→ juli(2分)
- C组:johan(5分)
替代简化写法(无需辅助列)
如果不想生成临时列,也可以先按组内规则排序,再按组的最高分排序分组:
# 先完成组内排序:分数降序,时间升序 df_sorted_inner = df.sort_values(['score', 'time'], ascending=[False, True]) # 按category分组后,按每组的最高分降序排列各组 df_sorted = df_sorted_inner.groupby('category', sort=False).apply( lambda x: x ).sort_index(key=lambda x: df.groupby('category')['score'].max()[x], ascending=False).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Wenjie Yu
相关产品推荐
相关产品推荐

