You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按年份筛选DataFrame中score列最高行?支持扩展至Top10

解决方案

1. 先创建示例DataFrame

用以下代码复现你的数据集:

import pandas as pd

data = {
    'Name': ['Tim', 'Tom', 'Larry', 'Dave', 'Rob', 'Sam', 'Jeff', 'Bill'],
    'age': [65, 72, 58, 81, 66, 32, 45, 47],
    'score': [123, 476, 354, 878, 1123, 45, 657, 771],
    'year': [2016, 2016, 2016, 2017, 2017, 2017, 2018, 2018],
    'state': ['KS', 'OH', 'NS', 'KS', 'OH', 'OH', 'OR', 'PA']
}

df = pd.DataFrame(data)

2. 保留每年score最高的记录(Top1)

通过groupby结合idxmax定位每组最高分的行索引,再提取对应数据:

# 获取每年score最高的行索引
top1_idx = df.groupby('year')['score'].idxmax()
# 生成结果DataFrame
top1_df = df.loc[top1_idx].reset_index(drop=True)

执行后top1_df即为你需要的预期结果。

3. 扩展:保留每年Top10高分记录

针对大规模数据集,推荐用排序+分组取前N行的方式,效率更优:

# 先按年份升序、分数降序排序,再按年份分组取前10行
top10_df = df.sort_values(by=['year', 'score'], ascending=[True, False]) \
             .groupby('year') \
             .head(10) \
             .reset_index(drop=True)

处理并列排名的情况

如果需要保留所有并列进入Top10的记录(比如第10名有多个相同分数),可以用rank方法实现:

# 计算每年的分数排名(降序,相同分数取相同排名)
df['rank'] = df.groupby('year')['score'].rank(ascending=False, method='min')
# 筛选排名<=10的行
top10_with_ties_df = df[df['rank'] <= 10].drop('rank', axis=1).reset_index(drop=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:07:20