You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:28:01