如何按年份筛选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
相关产品推荐
相关产品推荐

