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

Python Pandas指定多级表头时usecols参数使用问题求解

Pandas多级表头大文件指定顶级列读取方案

问题本质

Pandas读取双行/多级表头CSV时,usecols参数不会自动匹配同一顶级表头下的所有子列:直接传入顶级表头字符串(如"80.375")只会命中列名完全等于该字符串的单列,全量读取后再筛选列又会因为文件体量过大导致读取慢、内存占用高。

最优方案(无全量加载,内存占用最低)

核心思路是先单独读取表头拿到完整多级列名,筛选出目标列的完整标识后再传入usecols读取数据,全程不加载无关数据。

  • 第一步:仅读取前2行表头,不加载实际业务数据
import pandas as pd
# nrows=0 表示不读取数据行,仅加载表头
header_meta = pd.read_csv(files, delimiter=' ', nrows=0, header=[0,1])
# 筛选所有顶级表头为'80.375'的完整列名(多级列名格式为(顶级值, 二级值)的元组)
target_columns = [col for col in header_meta.columns if col[0] == "80.375"]
  • 第二步:传入筛选后的完整列名,仅读取目标列数据
df = pd.read_csv(files, delimiter=' ', header=[0,1], usecols=target_columns)

执行后会直接得到顶级表头为80.375的全部4列数据,读取速度、内存占用和读取单列基本一致。

适配固定列结构场景的快速方案

如果目标文件的列顺序固定不会变动,可以直接传入目标列的位置索引给usecols,省去提前读表头的步骤,读取速度更快:

# 示例:目标4列对应文件的第10-13列(位置索引从0开始计数,即9-12)
df = pd.read_csv(files, delimiter=' ', header=[0,1], usecols=range(9,13))

注意:如果文件列顺序可能调整,不要用这个方案,避免读错列。

内存极度紧张场景的备选方案

如果设备内存不足以支撑一次性加载所有目标列,可以用分块读取逻辑,逐块加载、筛选、拼接,控制峰值内存占用:

# 按每块10万行分批读取,可根据内存大小调整chunksize值
chunk_reader = pd.read_csv(files, delimiter=' ', header=[0,1], chunksize=100000)
# 逐块保留目标列后拼接为最终DataFrame
df = pd.concat([chunk[["80.375"]] for chunk in chunk_reader])

说明:DataFrame加载完成后,直接传入顶级表头值即可选中同组所有子列,该筛选逻辑仅在read_csv阶段的usecols参数中不生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:01:06