pandas read_csv usecols和名称不同步

时间:2017-07-25 15:08:30

标签: python python-3.x pandas dataframe

尝试使用带有pandas read_csv的表格文件中的索引读取某些列时,usecolsnames似乎彼此不同步。

例如,拥有文件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包含FOOBAR,如下所示:

     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没有意义

我真的需要通过索引读取列,然后为它们指定名称。有没有解决方法呢?

1 个答案:

答案 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被命令。所以在这种情况下,答案是按照你想要的顺序指定名称。