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

Pandas筛选连续匹配值时避免positional indexer越界报错

问题原因

代码触发越界的核心原因是:当当前DataFrame不存在满足「Col2为0.000000且连续出现至少10行」的片段时,filter处理后返回空DataFrame,此时直接调用.iloc[0]必然触发索引越界。另外现有代码里第一行filter的结果没有赋值,属于无效计算,重复写两次相同筛选逻辑也会浪费性能。

修复方案

不需要调整iloc或filter的底层逻辑,只需要在取数前先判断筛选结果是否为空,空的话直接返回np.nan即可,同时把重复的筛选逻辑抽成变量避免重复计算,最终可直接把结果和文件名整合为目标DataFrame。

完整可运行代码如下:

import os
import pandas as pd
import numpy as np

# 读取当前目录所有csv文件
csvs = [x for x in os.listdir('.') if x.endswith('.csv')]
dfs = []
for file in csvs:
    df = pd.read_csv(file)
    dfs.append(df)

result_list = []
# 按顺序遍历对应文件名和DataFrame
for file_name, dff1 in zip(csvs, dfs):
    # 生成分组标记:连续相同的Col2值会被分到同一组
    group_mark = (dff1['Col2'] != 0.000000).cumsum()
    # 筛选Col2为0、且连续长度≥10的片段
    filtered_seg = dff1[dff1['Col2'] == 0.000000].groupby(group_mark).filter(lambda x: len(x) >= 10)
    
    # 空结果直接赋值nan,避免越界
    if filtered_seg.empty:
        col1_val = np.nan
    else:
        # 取满足条件的第一个片段首行的Col1值
        col1_val = filtered_seg.iloc[0]['Col1']
    
    result_list.append({
        "csv_filename": file_name,
        "target_col1_value": col1_val
    })
    print(col1_val)

# 整合为最终结果DataFrame
final_result = pd.DataFrame(result_list)
关键修改点说明
  • 修复原代码阈值判断错误:原逻辑写的len(x) > 10只会筛选连续11行及以上的片段,和需求里的「至少10行」要求不符,改为>=10
  • 把重复的筛选计算抽为变量,避免两次执行相同的groupby+filter逻辑,提升运行效率
  • 增加空结果判断分支:筛选后无符合条件片段时直接赋值np.nan,不会触发iloc越界,代码可完整跑完所有文件
  • 读取文件时保持文件名和DataFrame的顺序一一对应,最终输出的Col1值顺序和csv文件遍历顺序完全一致,匹配预期输出格式

补充提示:如果Col2是浮点型字段,判断等于0时建议预留浮点误差容忍度,比如把dff1['Col2'] == 0.000000替换为np.isclose(dff1['Col2'], 0, atol=1e-6),避免因为浮点存储精度问题漏判实际为0的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:51:32