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
相关产品推荐
相关产品推荐

