【问题标题】:pandas read_csv usecols and names out of syncpandas read_csv usecols 和名称不同步
【发布时间】:2017-07-25 15:08:30
【问题描述】:

当尝试使用带有 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 没有意义 .

我真的需要通过索引读取列,然后为它们分配名称。有什么解决方法吗?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    文档在这方面可能会更清楚(随意提出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 是有序的。所以在这种情况下,答案是按照您想要的顺序指定名称。

    【讨论】:

    • 是的,没错。此时文档可能会更清晰。我找到的解决方案是在读取文件时不使用names,使用相同的cols 索引重新排序df,最后重命名列。比如:df = pd.read_csv(..., usecols=cols)[cols]; df.columns = names
    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2017-06-21
    • 2020-03-27
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多