You need to enable JavaScript to run this app. pandas DataFrame按pidx分组后取每组score最高Top3行的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

pandas DataFrame按pidx分组后取每组score最高Top3行的实现方法

pandas 按分组提取每组score最高前3条记录的实现方案

原有尝试代码的问题定位

你之前编写的代码无法输出符合预期的结果,主要由两个问题导致:

  • df.sort(['pidx','score'],ascending = False)是pandas 0.20版本前的废弃API,当前主流版本pandas已不支持该写法,排序操作需替换为sort_values()方法,否则会直接触发属性报错。
  • 代码中通过head(2)仅截取每组前2条记录,和需求要求的取前3条不匹配;同时对pidx和score统一设置为降序排列,会导致最终输出的pidx值从大到小排布,和目标格式的pidx升序展示要求错位。

核心实现步骤

实现目标效果的核心逻辑是先通过多列排序把同组数据、组内高分数据调整到连续靠前的位置,再按分组截取指定长度的记录:

  1. 设置多列排序规则:先按pidx列升序排列,保证同pidx的记录连续、最终输出时pidx值从小到大依次展示;再按score列降序排列,让同pidx下得分更高的记录排在组内靠前位置。
  2. 完成全表排序后按pidx执行分组,直接调用head(3)截取每组前3条记录,即可得到符合格式要求的结果数据集。

基础实现代码:

# 按列匹配对应排序方向完成全表排序
sorted_df = df.sort_values(
    by=["pidx", "score"],
    ascending=[True, False]
)
# 按pidx分组取每组score最高的前3条记录
result_df = sorted_df.groupby("pidx").head(3)

稳定性优化

如果同组内存在score值相同的并列场景,可以追加tie-break排序规则,避免相同分数的记录顺序随机变动,让输出结果稳定可复现,例如追加按day_no列升序排列:

sorted_df = df.sort_values(
    by=["pidx", "score", "day_no"],
    ascending=[True, False, True]
)
result_df = sorted_df.groupby("pidx").head(3)

内容的提问来源于stack exchange,提问作者Kintaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 20:24:05