【问题标题】:read a csv to df with a different columns order用不同的列顺序读取 csv 到 df
【发布时间】:2019-01-17 13:31:44
【问题描述】:

我有一个通过其他人的脚本创建的大型 CSV 文件,其中包含名为“D”、“B”、“A”、“C”的输出列。
有没有办法直接从CSV读取它作为'A','B','C','D'。

【问题讨论】:

标签: python pandas csv


【解决方案1】:

我发现这个解决方案适用于 pandas 0.25.1

具有名为“D”、“B”、“A”、“C”的输出列的 CSV 文件 直接从 CSV 中读取为“A”、“B”、“C”、“D”

import pandas as pd
csv = pd.read_csv(data, index_col=['A', 'B', 'C', 'D'], usecols=['A', 'B', 'C', 'D'])

它以给定的顺序将 CSV 列读入名为“csv”的 pandas DataFrame index_col=[] 和 usecols=[] 都必须包含相同的列表顺序。

【讨论】:

    【解决方案2】:

    我认为read_csv 做不到,usecols 的想法也行不通:

    import pandas as pd
    
    temp=u"""D;B;A;C
    0;a;4;7;1
    1;b;5;8;3
    2;c;4;9;5
    3;d;5;4;7
    4;e;5;2;1
    5;f;4;3;0"""
    #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(pd.compat.StringIO(temp), sep=";", usecols=['A', 'B', 'C', 'D'])
    print (df)
       D  B  A  C
    0  0  a  4  7
    1  1  b  5  8
    2  2  c  4  9
    3  3  d  5  4
    4  4  e  5  2
    5  5  f  4  3
    

    解决方案是按列表或排序索引更改顺序:

    df = df[['A', 'B', 'C', 'D']]
    print (df)
       A  B  C  D
    0  4  a  7  0
    1  5  b  8  1
    2  4  c  9  2
    3  5  d  4  3
    4  5  e  2  4
    5  4  f  3  5
    

    df = df.sort_index(axis=1)
    print (df)
       A  B  C  D
    0  4  a  7  0
    1  5  b  8  1
    2  4  c  9  2
    3  5  d  4  3
    4  5  e  2  4
    5  4  f  3  5
    

    【讨论】:

      【解决方案3】:

      一种方法是一次读取一列并存储在列表理解中,然后concat 结果:

      In[121]:
      t="""D,B,A,C
      4,2,1,3"""
      cols = list('ABCD')
      pd.concat([pd.read_csv(io.StringIO(t), usecols=[x]) for x in cols], axis=1)
      
      Out[121]: 
         A  B  C  D
      0  1  2  3  4
      

      但是,我认为通过在正常阅读后按您想要的顺序子选择列来对其进行排序会更容易:

      df = df[['A','B','C','D']]
      

      【讨论】:

        【解决方案4】:

        我假设您不是在询问如何更改 Pandas 中的列顺序,而是想在读入之前更改它,可能是为了减少内存使用。 (如果没有看到@jezrael 的回答。)

        最好在读入 Pandas 之前使用csv。示例:

        import csv
        
        with open('file.csv', 'r') as infile, open('reordered.csv', 'a') as outfile:
            fieldnames = ['A', 'B', 'C', 'D']
            writer = csv.DictWriter(outfile, fieldnames=fieldnames)
            writer.writeheader()
            for row in csv.DictReader(infile):
                writer.writerow(row)
        

        取自here

        就时间而言,最快的是以 CSV 格式进行的(我用一个非常小的 csv 文件进行了测试):

        %%time
        df = pd.read_csv('r.csv')[['A', 'B', 'C', 'D']]
        
        CPU times: user 3.53 ms, sys: 1.48 ms, total: 5 ms
        Wall time: 3.79 ms
        
        %%time
        df=pd.read_csv('r.csv')[df.columns[::-1]]
        
        CPU times: user 4.75 ms, sys: 2.01 ms, total: 6.76 ms
        Wall time: 5.13 ms
        
        %%time
        cols=list('ABCD')
        pd.concat([pd.read_csv('r.csv', usecols=[x]) for x in cols], axis=1)
        
        CPU times: user 8.98 ms, sys: 2.25 ms, total: 11.2 ms
        Wall time: 9.88 ms
        
        %%time
        df = pd.read_csv('r.csv').sort_index(axis=1)
        
        CPU times: user 4.21 ms, sys: 1.88 ms, total: 6.09 ms
        Wall time: 4.65 ms
        
        %%time
        with open('r.csv', 'r') as infile, open('reordered.csv', 'a') as outfile:
        
            fieldnames = ['A', 'B', 'C', 'D']
            writer = csv.DictWriter(outfile, fieldnames=fieldnames)
            writer.writeheader()
            for row in csv.DictReader(infile):
                writer.writerow(row)
        df = pd.read_csv('reordered.csv')
        
        CPU times: user 3.29 ms, sys: 1.91 ms, total: 5.2 ms
        Wall time: 3.83 ms
        

        【讨论】:

        • 我不关心那个文件本身,它很快就会被删除。我只想按我需要的顺序阅读。
        【解决方案5】:

        添加 .reset_index() 以重置 index_col 集合中的索引。

        import pandas as pd
        csv = pd.read_csv(data, index_col=['A', 'B', 'C', 'D'], usecols=['A', 'B', 'C', 'D']).reset_index() 
        

        【讨论】:

          【解决方案6】:

          试试熊猫:

          import pandas as pd
          df=pd.read_csv(filename)
          df=df[df.columns[::-1]]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-12
            • 2022-01-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多