尝试使用带有pandas read_csv
的表格文件中的索引读取某些列时,usecols
和names
似乎彼此不同步。
例如,拥有文件test.csv
:
FOO A -46450.494736 0.0728830817231
FOO A -46339.7126846 0.0695018062805
FOO A -46322.4942905 0.0866205763556
FOO B -46473.3117983 0.0481618121947
FOO B -46537.6827055 0.0436893868921
FOO B -46467.2102205 0.0485001911304
BAR C -33424.1224914 6.7981041851
BAR C -33461.4101485 7.40607068177
BAR C -33404.6396495 4.72117502707
并尝试按索引读取3列而不保留原始顺序:
cols = [1, 2, 0]
names = ['X', 'Y', 'Z']
df = pd.read_csv(
'test.csv', sep='\t',
header=None,
index_col=None,
usecols=cols, names=names)
我收到以下数据框:
X Y Z
0 FOO A -46450.494736
1 FOO A -46339.712685
2 FOO A -46322.494290
3 FOO B -46473.311798
4 FOO B -46537.682706
5 FOO B -46467.210220
6 BAR C -33424.122491
7 BAR C -33461.410148
8 BAR C -33404.639650
而我希望列Z
包含FOO
和BAR
,如下所示:
Z X Y
0 FOO A -46450.494736
1 FOO A -46339.712685
2 FOO A -46322.494290
3 FOO B -46473.311798
4 FOO B -46537.682706
5 FOO B -46467.210220
6 BAR C -33424.122491
7 BAR C -33461.410148
8 BAR C -33404.639650
我知道pandas将数据帧存储为字典,因此列的顺序可能与使用usecols的请求不同,但问题是使用带索引和名称的usecols没有意义
我真的需要通过索引读取列,然后为它们指定名称。有没有解决方法呢?
答案 0 :(得分:2)
文档可以更清楚(可以随意制作issue,甚至更好地提交拉取请求!)但usecols
设置为类似 - 它没有定义列的顺序,它只是针对会员资格进行测试。
from io import StringIO
pd.read_csv(StringIO("""a,b,c
1,2,3
4,5,6"""), usecols=[0, 1, 2])
Out[31]:
a b c
0 1 2 3
1 4 5 6
pd.read_csv(StringIO("""a,b,c
1,2,3
4,5,6"""), usecols=[2, 1, 0])
Out[32]:
a b c
0 1 2 3
1 4 5 6
另一方面, names
被命令。所以在这种情况下,答案是按照你想要的顺序指定名称。