Pandas读取大CSV时如何高效提取目标列及其前序列
问题描述
现有带重复列名的CSV文件,需提取speed、status两列及对应关联的前置time列数据。
初始硬编码列名的实现代码如下:
used_columns=['time.2','speed','time.4','status'] df = pd.read_csv(path,usecols=used_columns)
该方案存在明显缺陷:待处理CSV文件量大、不同文件列结构存在差异,硬编码列名一旦遇到某列缺失就会直接报错。如果先读取全量数据获取列名再筛选,会因为单文件体积大、总文件数多产生极高的性能开销,需要低开销的高效实现方案。
实现方案
仅读取CSV第一行表头即可完成目标列定位,全程不会加载全量数据,性能开销可以忽略:
- 零开销获取所有列名
调用pd.read_csv时传入nrows=0参数,只会解析表头行,不会读取任何实际业务数据:import pandas as pd # 仅加载表头,毫秒级返回 all_columns = pd.read_csv(path, nrows=0).columns.tolist() - 动态匹配目标列
遍历列名列表,自动定位speed、status列的位置,同时收集对应的前置time列,不需要硬编码列序号或后缀:selected_cols = [] for idx, col in enumerate(all_columns): # 适配重复列名场景,匹配列名核心为speed/status的字段 if col.startswith(('speed', 'status')): # 收集目标列对应的前置time列 if idx > 0: selected_cols.append(all_columns[idx-1]) # 收集目标列本身 selected_cols.append(col) # 去重避免重复匹配 selected_cols = list(set(selected_cols)) - 按匹配结果读取需要的列
最终读取时只加载筛选出的目标列,无多余IO开销:df = pd.read_csv(path, usecols=selected_cols)
适配提示:如果重复列的命名规则不是pandas默认的
.序号后缀,可以调整列名判断逻辑,只要在表头遍历阶段做对应匹配即可,全程不会增加额外的读取开销。
内容的提问来源于stack exchange,提问作者Zee
相关产品推荐
相关产品推荐

