pandas.read_csv:仅加载特定列和Unnamed索引

2 投票
1 回答
65 浏览
提问于 2025-04-13 01:07

在处理一个很大的数据集时,我想只加载其中的一部分(更准确地说,我只想加载训练数据样本),因为加载整个数据集会花费一些时间和内存。我知道我感兴趣的列的名字,但索引列没有名字。问题是,按照我所知,pandas.read_csv()usecols参数只能接受列名或者列号,我不知道是否可以把两者混合使用。

目前,我用一种比较麻烦的方法来解决这个问题:

#load only the columns of the dataset
cols = pd.read_csv('dataset.tsv.gz', sep='\t', index_col=0, nrows=0).columns  

#find the positions of the columns of interest (those in my_columns_list) 
colnums = np.nonzero(cols.isin(my_colmuns_list))[0]

#shift column numbers by one and insert 0 for the index column
colnums = np.insert(colnums+1, 0, 0)

#read the dataset
X = pd.read_csv('dataset.tsv.gz', sep='\t', index_col=0, usecols=colnums)  

显然,另一种解决方案是先加载整个数据集,给索引列命名(比如叫'index_column'),然后重新保存数据集,这样我就可以简单地使用:

X = pd.read_csv('dataset.tsv.gz', sep='\t', index_col=0, usecols=['index_column'] + my_columns_list)

但这样的话,每次处理新的数据集时都得重复这个操作(my_columns_list中的样本名字是独立于响应变量已知的)。

1 个回答

1

我会加载一个数据集,并指定想要的列名(用 usecols 参数),同时把 index_col 设置为 False。在我的列名列表的开头加上 'Unnamed: 0':

my_columns_list = ['Unnamed: 0'] + my_columns_list
X = pd.read_csv('dataset.tsv.gz',
                sep='\t',
                index_col=False,
                header=0,
                usecols=my_columns_list)

我试着用下面这个简单的例子来说明:

import pandas as pd
tsv = f"""\tsub0\tsub1\tsub2\tsub3
   0\t0\t1\t2\t3
   1\t10\t11\t12\t13
   2\t20\t21\t22\t23
   3\t30\t31\t32\t33"""

f = open('toto.tsv', 'w')
f.write(tsv)
f.close()
my_columns_list = ['sub0', 'sub3']
my_columns_list = ['Unnamed: 0'] + my_columns_list

df_all = pd.read_csv('toto.tsv',
                     index_col=False,
                     sep='\t',
                     header=0)
print(df_all)

这样做会输出(当加载整个数据集时):

     Unnamed: 0  sub0  sub1  sub2  sub3
0             0     0     1     2     3
1             1    10    11    12    13
2             2    20    21    22    23
3             3    30    31    32    33

现在,把 index_col 设置为 False,你可以通过 usecols 参数来给出想要的列名:

df_selected = pd.read_csv('toto.tsv',
                  index_col=False,
                  sep='\t',
                  header=0,
                  usecols=my_columns_list)
print(df_selected)

这样输出的结果是:

     Unnamed: 0  sub0  sub3
0             0     0     3
1             1    10    13
2             2    20    23
3             3    30    33

撰写回答