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
相关产品推荐
相关产品推荐

