如何用pandas.read_csv加载指定列与无名称索引列?
问题:Pandas读取无列名索引的大型数据集时,混合指定索引列与目标列名加载
处理大型数据集时,为节省时间和内存,只想加载部分训练样本数据。已知目标列的名称,但索引列没有列名,而pandas.read_csv()的usecols参数仅支持纯列名或纯列号,无法直接混合使用二者。
现有解决方案的不足
目前有两种绕路方法,但都存在局限:
- 先读取列名再计算目标列位置(繁琐):
# 仅加载数据集的列名 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)
- 修改原数据集为索引列命名(不灵活):
需要先全量加载数据集,给索引列命名后重新保存,再通过列名指定加载:
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.
相关产品推荐
相关产品推荐

