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

Pandas读取大CSV时如何高效提取目标列及其前序列

问题描述

现有带重复列名的CSV文件,需提取speed、status两列及对应关联的前置time列数据。
初始硬编码列名的实现代码如下:

used_columns=['time.2','speed','time.4','status']
df = pd.read_csv(path,usecols=used_columns)

该方案存在明显缺陷:待处理CSV文件量大、不同文件列结构存在差异,硬编码列名一旦遇到某列缺失就会直接报错。如果先读取全量数据获取列名再筛选,会因为单文件体积大、总文件数多产生极高的性能开销,需要低开销的高效实现方案。

实现方案

仅读取CSV第一行表头即可完成目标列定位,全程不会加载全量数据,性能开销可以忽略:

  1. 零开销获取所有列名
    调用pd.read_csv时传入nrows=0参数,只会解析表头行,不会读取任何实际业务数据:
    import pandas as pd
    # 仅加载表头,毫秒级返回
    all_columns = pd.read_csv(path, nrows=0).columns.tolist()
    
  2. 动态匹配目标列
    遍历列名列表,自动定位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))
    
  3. 按匹配结果读取需要的列
    最终读取时只加载筛选出的目标列,无多余IO开销:
    df = pd.read_csv(path, usecols=selected_cols)
    

适配提示:如果重复列的命名规则不是pandas默认的.序号后缀,可以调整列名判断逻辑,只要在表头遍历阶段做对应匹配即可,全程不会增加额外的读取开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:06:08