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

Python:基于条件获取DataFrame的起始和结束索引

如何在Python DataFrame中识别连续符合条件的区间并生成记录

我来帮你解决这个问题——我们可以写一个通用的函数,既能处理你示例中的Null值连续区间,也能支持任意自定义条件。下面一步步来实现:

首先,先构造你给出的示例DataFrame:

import pandas as pd
import numpy as np

# 构造示例数据
df = pd.DataFrame({
    'A': [10, np.nan, np.nan, np.nan, 29],
    'B': [15, 20, 10, np.nan, 35],
    'C': [20, 11, np.nan, np.nan, 40]
}, index=[1,2,3,4,5])

接下来是核心的通用函数,它会遍历每一列,找出连续满足指定条件的区间,并生成你需要的记录格式:

def find_continuous_ranges(df, condition_func, comment="Condition Met"):
    result_records = []
    
    # 逐个处理每一列
    for column_name in df.columns:
        # 生成当前列中每个元素是否符合条件的布尔掩码
        condition_mask = df[column_name].apply(condition_func)
        
        # 如果没有符合条件的元素,直接跳过当前列
        if not condition_mask.any():
            continue
        
        # 标记连续符合条件的"块":当掩码从False切换到True时,块编号递增
        continuous_block_ids = (~condition_mask).cumsum()[condition_mask]
        
        # 按块分组,获取每个块的起始和结束索引
        block_groups = continuous_block_ids.groupby(continuous_block_ids).agg(['first', 'last'])
        
        # 把每个块的信息整理成目标格式
        for _, (start_idx, end_idx) in block_groups.iterrows():
            result_records.append({
                'StartIndex': start_idx,
                'EndIndex': end_idx,
                'ColumnName': column_name,
                'Comment': comment
            })
    
    # 把结果转成DataFrame返回
    return pd.DataFrame(result_records)

测试Null值的情况

现在用这个函数处理你要的Null值场景:

# 查找连续Null值的区间,指定Comment为"Null"
null_result = find_continuous_ranges(df, lambda x: pd.isna(x), comment="Null")
print(null_result)

输出结果完全符合你的要求:

StartIndex  EndIndex ColumnName Comment
0           2         4          A    Null
1           4         4          B    Null
2           3         4          C    Null

支持自定义条件

这个函数的优势在于可以轻松支持任何你需要的条件,比如:

  • 查找值大于30的连续区间
  • 查找值小于15的连续区间

举个例子,查找值大于30的区间:

# 自定义条件:值大于30,Comment设为"Value > 30"
gt30_result = find_continuous_ranges(df, lambda x: x > 30, comment="Value > 30")
print(gt30_result)

输出结果:

StartIndex  EndIndex ColumnName       Comment
0           5         5          B  Value > 30
1           5         5          C  Value > 30

函数原理说明

简单解释一下这个函数的核心逻辑:

  1. 条件掩码:用condition_func对列中每个元素做判断,得到布尔数组标记哪些元素符合要求
  2. 块标记:通过对"不符合条件"的位置做累加,把连续符合条件的元素归为同一个块编号
  3. 分组统计:按块编号分组,提取每个块的第一个和最后一个索引,就是区间的起始和结束
  4. 结果整理:把每个块的信息转成你需要的字典格式,最终组合成DataFrame

这个方法不管你的DataFrame索引是整数、日期还是其他类型,都能正常工作,非常灵活。

内容的提问来源于stack exchange,提问作者NewCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:29:37