Python过滤Excel传感器异常值时代码需重复运行的问题求解
问题原因
你的猜测完全准确,过滤逻辑需要运行两次才生效的核心原因有两个:
- 正序遍历
rotor[i]['Path']列表的同时,在循环内部执行pop删除当前列表元素,删除操作会让被删位置之后的所有元素索引整体前移1位,但遍历指针还是按原顺序向后走,会直接跳过被删元素的下一个值,第一次运行会漏删近一半异常值,第二次遍历才能扫到第一次漏掉的异常值。 - 你用
rotor[i]['Path'].index(v)查找待删除位置的写法存在隐藏bug:如果列表中存在多个数值和v相等的元素,index()方法永远返回第一个匹配元素的索引,会误删位置靠前的正常数据。
另外你代码开头写的字典判空清空、手动del临时变量的逻辑都是冗余无效代码,可以直接删除。
最优修复方案
你已经用pandas完成了Excel读取,完全不需要把数据转成字典再手动逐列pop删除,直接用pandas内置的布尔索引做行过滤即可,三列数据会自动同步对齐,不会出现漏删、错删问题,代码也更简洁,后续做绘图、拟合计算直接用pandas对象也更方便。
修正后代码
import os import pandas as pd rotor = {} file_idx = 1 for file in os.listdir(): if file.endswith(".xlsx"): # 读取Excel前3列并命名 raw_df = pd.read_excel(file, usecols=(0, 1, 2), names=('Time', 'Path', 'Force')) # 过滤Path列异常值,保留0~400区间的有效行 clean_df = raw_df[(raw_df['Path'] >= 0.0) & (raw_df['Path'] <= 400.0)].reset_index(drop=True) # 按需存储,后续做计算绘图直接存clean_df即可,需要列表格式字典再转 rotor[file_idx] = clean_df # 若需要字典格式则替换为:rotor[file_idx] = clean_df.to_dict('list') file_idx += 1
如果你不想用pandas内置过滤、坚持手动操作列表,要规避遍历删元素的问题,可以选择两种方案:一是从列表最后一个元素倒序遍历到第一个元素,此时删除元素不会影响还没遍历到的前置元素的索引;二是遍历原列表时把符合要求的有效值追加到新的空列表里,遍历完成后用新列表直接替换原列表,不要在遍历过程中修改原列表。
内容的提问来源于stack exchange,提问作者Tonci
相关产品推荐
相关产品推荐

