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

如何用pandas.read_csv加载指定列与无名称索引列?

问题:Pandas读取无列名索引的大型数据集时,混合指定索引列与目标列名加载

处理大型数据集时,为节省时间和内存,只想加载部分训练样本数据。已知目标列的名称,但索引列没有列名,而pandas.read_csv()的usecols参数仅支持纯列名或纯列号,无法直接混合使用二者。

现有解决方案的不足

目前有两种绕路方法,但都存在局限:

  1. 先读取列名再计算目标列位置(繁琐):
# 仅加载数据集的列名
cols = pd.read_csv('dataset.tsv.gz', sep='\t', index_col=0, nrows=0).columns  

# 找到目标列的位置
colnums = np.nonzero(cols.isin(my_columns_list))[0]

# 偏移列号并插入索引列位置
colnums = np.insert(colnums+1, 0, 0)

# 读取数据集
X = pd.read_csv('dataset.tsv.gz', sep='\t', index_col=0, usecols=colnums)  
  1. 修改原数据集为索引列命名(不灵活):
    需要先全量加载数据集,给索引列命名后重新保存,再通过列名指定加载:
X = pd.read_csv('dataset.tsv.gz', sep='\t', index_col=0, usecols=['index_column'] + my_columns_list)

但这种方法每次处理新数据集都要重复执行,效率很低。

更简洁的优化方案

不需要依赖第三方库或修改原数据集,用原生Python和Pandas即可实现:

# 快速读取表头(仅读0行),分离索引列与常规列名
_, *cols = pd.read_csv('dataset.tsv.gz', sep='\t', nrows=0).columns

# 推导目标列对应的原始列号(索引列占第0位,常规列位置需+1)
target_col_indices = [i+1 for i, col in enumerate(cols) if col in my_columns_list]

# 加载指定列:索引列+目标列
X = pd.read_csv('dataset.tsv.gz', sep='\t', index_col=0, usecols=[0] + target_col_indices)

方案说明

  • 第一步通过nrows=0快速读取完整表头(包括索引列的空名称),用解包操作直接分离出索引列和其他常规列名,避免全量加载数据。
  • 遍历常规列名,用列表推导式直接计算出目标列对应的原始文件列号(因索引列占第0位,常规列的位置是其在列表中的索引+1)。
  • 最后将索引列位置0与目标列位置合并,传给usecols,同时指定index_col=0,即可精准加载所需数据。

内容的提问来源于stack exchange,提问作者Roger V.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:25:58