如何从按年份划分的DataFrame中提取每年的前2-3个最高值
按年份筛选DataFrame中前N个最高值的行
假设你的DataFrame包含年份列(比如year)和需要排序的数值列(比如value),下面提供两种常见场景的实现方式:
场景1:严格取每年前N行(按数值降序,仅保留前N条记录)
如果只需要每年排序后的前N行(即使存在数值并列,也只取前N条),可以用groupby结合nlargest快速实现:
import pandas as pd # 示例DataFrame data = { 'year': [2020, 2020, 2020, 2021, 2021, 2021, 2021], 'value': [10, 20, 20, 30, 40, 40, 50] } df = pd.DataFrame(data) # 设置要保留的每年最高值数量 top_n = 2 # 分组筛选 result = df.groupby('year', group_keys=False).apply(lambda x: x.nlargest(top_n, 'value'))
场景2:保留所有属于前N个最高值的行(含并列)
如果需要保留所有数值属于每年前N个最高值的记录(比如某年份有多个行数值并列第二,全部保留),可以用排名方法实现:
# 设置要保留的最高值个数 top_n = 2 # 按年份分组计算稠密排名(相同数值排名相同) df['rank'] = df.groupby('year')['value'].rank(method='dense', ascending=False) # 筛选排名<=top_n的行,最后删除临时排名列 result = df[df['rank'] <= top_n].drop(columns='rank')
两种方法的区别:
- 场景1会严格限制每年的行数为N,适合只需要固定条数的需求;
- 场景2会保留所有符合前N个最高值的行,适合需要包含并列数据的需求。
内容的提问来源于stack exchange,提问作者Bruno Queiroz
相关产品推荐
相关产品推荐

