如何用Python基于txt列表高效过滤csv/txt/Excel文件数据
高效数据筛选实现方案
核心优化逻辑:放弃原生Python逐行逐列循环匹配的思路,先把txt存储的目标样本名转为**集合(set)**结构(成员判断时间复杂度为O(1)),再用pandas的矢量化操作完成批量筛选,整体时间复杂度从逐循环的O(n*m)降到O(n+m),数据量越大性能优势越明显,十万级行数据基本可以做到毫秒级返回结果。
前置依赖安装
执行以下命令安装需要的第三方库:pip install pandas openpyxl
注:处理csv/txt格式数据不需要openpyxl依赖,仅读取xlsx格式Excel文件时需要用到。
通用实现代码(适配绝大多数场景)
- 先读取txt中的目标样本名,自动去重、跳过空行
- 一次性加载原始数据文件(Excel/csv/txt均支持)
- 用矢量化布尔索引直接筛选匹配的样本数据
- 导出筛选后的结果文件
import pandas as pd # 读取目标样本名列表,txt要求每行存一个Sample_name with open("target_sample_list.txt", "r", encoding="utf-8") as f: target_samples = {line.strip() for line in f if line.strip()} # 读取原始数据,根据自己的文件格式二选一即可 # 读取Excel xlsx格式 raw_df = pd.read_excel("raw_data.xlsx", dtype={"Sample_name": str}) # 读取csv格式 # raw_df = pd.read_csv("raw_data.csv", dtype={"Sample_name": str}) # 筛选匹配数据:Sample_name为行标识(每行对应一个样本)时用这行 filtered_df = raw_df[raw_df["Sample_name"].isin(target_samples)] # 如果你的实际场景是Sample_name为列名(每列对应一个样本),把上面筛选行替换成下面的筛列代码即可 # filtered_df = raw_df.loc[:, raw_df.columns.isin(target_samples | {"Sample_name"})] # 导出结果,根据需要选格式 filtered_df.to_excel("filtered_result.xlsx", index=False) # 导出csv用下面的代码,utf-8-sig编码避免中文乱码 # filtered_df.to_csv("filtered_result.csv", index=False, encoding="utf-8-sig")
超大文件适配方案(单文件超内存容量时使用)
如果原始数据是百万行级以上,一次性加载会占满内存,可以改用分块读取的逻辑,性能依然远高于手写逐行循环:
import pandas as pd with open("target_sample_list.txt", "r", encoding="utf-8") as f: target_samples = {line.strip() for line in f if line.strip()} # 每次加载10000行到内存处理,可根据自己的内存大小调整chunksize值 result_chunks = [] for chunk in pd.read_csv("raw_data.csv", dtype={"Sample_name": str}, chunksize=10000): match_chunk = chunk[chunk["Sample_name"].isin(target_samples)] result_chunks.append(match_chunk) # 拼接所有匹配的分块后导出 final_df = pd.concat(result_chunks, ignore_index=True) final_df.to_csv("filtered_result.csv", index=False, encoding="utf-8-sig")
性能差异说明
- 逐列逐行循环方案:每匹配一个值都要遍历整个目标列表,10万行数据+1000个目标样本的场景通常需要数秒到数十秒运行时间,数据量翻倍运行时间接近指数级上升
- 本方案:集合匹配加底层C实现的矢量化操作,同数据量场景运行时间通常在百毫秒级,内存足够的情况下千万行级数据也能在数秒内处理完成
内容的提问来源于stack exchange,提问作者Brandon Matsumoto
相关产品推荐
相关产品推荐

