Pandas DataFrame 如何按start列±3范围保留score最高的行?
Pandas 按 start 列±3区间保留最高score行实现
实现逻辑
- 先对
start列做升序排序,将相邻start差值≤3的行划为同一个连通区间(完全匹配你给出的示例判定规则) - 按区间分组,直接保留每组
score最高的行即可
完整可运行代码
import pandas as pd # 原始输入数据 data = {'id':['id1', 'id2', 'id3', 'id4', 'id5', 'id6'], 'start':[1,12,11,2,20,3], 'score':[3,1,8,2,5,9]} df = pd.DataFrame(data, columns=['id', 'start', 'score']) # 1. 按start升序排序,重置索引避免后续取值错误 df = df.sort_values('start', ignore_index=True) # 2. 划分区间:相邻start差值>3则判定为新组,累计得到每个行的组号 group_marks = (df['start'].diff() > 3).cumsum() # 3. 按组取score最高的行 result = df.loc[df.groupby(group_marks)['score'].idxmax()].reset_index(drop=True) print(result)
运行输出
id start score 0 id6 3 9 1 id3 11 8 2 id5 20 5
完全匹配你给出的期望输出结果。
扩展说明
- 若需要调整区间阈值(比如改为±5),只需修改分组步骤中
diff() > 3里的数字为对应阈值即可 - 该逻辑自动处理重复start、多连续点跨区间等特殊场景,无需额外调整
内容的提问来源于stack exchange,提问作者Cody Glickman
相关产品推荐
相关产品推荐

