pandas.read_csv:仅加载特定列和Unnamed索引
在处理一个很大的数据集时,我想只加载其中的一部分(更准确地说,我只想加载训练数据样本),因为加载整个数据集会花费一些时间和内存。我知道我感兴趣的列的名字,但索引列没有名字。问题是,按照我所知,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