Pandas如何仅保留连续索引分组中首个值对应的行
Pandas 过滤连续索引分组首行的高效实现
核心思路是通过索引的差分判断连续分组的边界,仅保留每个连续分组的第一行,全部为向量化操作,执行效率极高,适配大流量数据场景。
实现代码
最简写法(推荐)
通过差分直接生成过滤掩码,一步得到结果:
import pandas as pd # 原始DataFrame构造代码 data = {"A":[i for i in range(10)]} index = [1, 3, 4, 5, 9, 10, 12, 13, 15, 20] df = pd.DataFrame(index=index, data=data) # 核心过滤逻辑 mask = df.index.to_series().diff().ne(1) result = df[mask] print(result)
逻辑说明:
df.index.to_series()将索引转换为Series,方便调用Pandas内置的差分方法diff()计算相邻索引的差值,第一个元素的差值默认返回NaNne(1)判断差值是否不等于1,返回布尔掩码:值为True的位置就是新连续分组的第一行,天然包含整个DataFrame的第一行(NaN和1比较结果为True)
分组写法(适配后续聚合需求)
如果后续需要对连续索引分组做其他计算,可以先生成分组编号再取首行:
# 生成连续分组的唯一编号 group_id = df.index.to_series().diff().ne(1).cumsum() # 每个分组取第一行 result = df.groupby(group_id).first()
输出结果
两种写法都会得到预期输出:
A 1 0 3 1 9 4 12 6 15 8 20 9
内容的提问来源于stack exchange,提问作者Cord Kaldemeyer
相关产品推荐
相关产品推荐

