如何用Pandas高效识别DataFrame中符合条件的连续索引序列?
高效识别Pandas中符合条件的连续索引区间
针对你的需求,完全可以利用Pandas的向量化操作替代循环,大幅提升效率。核心思路是通过索引差值判断连续性,再分组聚合首尾索引,具体实现如下:
步骤1:筛选目标行并保留原索引
先筛选出column等于1的行,保留原索引用于后续连续性判断:
import pandas as pd df = pd.DataFrame({ 'column': [0,0,1,1,1,2,2,2,2,1,1,] }) # 筛选目标行,保留原索引 filtered = df[df['column'] == 1]
步骤2:标记连续索引的分组
计算索引的差值,差值为1表示连续,否则是新连续块的起点;再用cumsum()生成每个连续块的分组ID:
# 计算索引差值,首次行差值设为1(确保第一个块被正确标记) diff_idx = filtered.index.to_series().diff().fillna(1) # 差值不等于1时标记为新组,累加得到分组ID groups = (diff_idx != 1).cumsum()
步骤3:聚合每个分组的首尾索引
按分组ID聚合,提取每个组的最小和最大索引,得到连续区间:
# 聚合得到每个组的首尾索引,转为列表形式 result = filtered.groupby(groups).apply(lambda x: (x.index.min(), x.index.max())).tolist() print(result) # 输出: [(2, 4), (9, 10)]
简化版代码
可以把上述步骤合并为更简洁的链式操作:
result = ( df[df['column'] == 1] .assign(group=lambda x: (x.index.to_series().diff() != 1).cumsum()) .groupby('group') .apply(lambda x: (x.index.min(), x.index.max())) .tolist() )
这种方法基于Pandas向量化操作,避免了Python循环的性能瓶颈,数据量越大优势越明显。
内容的提问来源于stack exchange,提问作者ninjacowgirl
相关产品推荐
相关产品推荐

