【问题标题】:Interchanging columns in a CSV file交换 CSV 文件中的列
【发布时间】:2016-10-25 22:49:16
【问题描述】:

我有一个 csv 文件,我需要更改列索引。我当前的文件是

A   B   C   D   E   F   G
1   0   0.5 5   1   7   6
2   0   0.6 4   0   7   6
3   0   0.7 3   1   7   6
4   0   0.8 2   0   7   6

但我需要它:

D   F   G   A   B   C   E
5   7   6   1   0   0.5 1
4   7   6   2   0   0.6 0
3   7   6   3   0   0.7 1
2   7   6   4   0   0.8 0

这只是一个测试用例。我有一个包含 1000 多列的文件。谢谢

【问题讨论】:

    标签: python python-2.7 numpy pandas


    【解决方案1】:

    使用 csv.DictReader csv.DictWriter。

    import csv
    with open('names_in.csv') as csvin, open('names_out.csv', 'w') as csvout:
         reader = csv.DictReader(csvin)
         writer = csv.DictWriter(csvout, fieldnames=["D", "F", "G", "A", "B","C", "E"])
         for row in reader:
            writer.writerow(row)
    

    只需确保字段名与输入文件中的字段匹配即可。您只需复制reader.fieldnames 并重新排列即可。

    【讨论】:

    • 这有效,但仅适用于小文件。在具有一千列的文件中,不可能写下所有列名。有更好的方法吗?假设我想在 1000 列文件中将最后 10 列放在前面。应该采用什么方法?
    • @DigantaBharali 您可以以编程方式执行此操作,复制 reader.fieldnames 这是一个包含所有列名的列表,然后按照您的意愿排列它old_column = reader.fieldnames ; new_column = old_column[-10:0] + old_column[0:-10]
    【解决方案2】:

    您可以使用pandas.read_csv 读取您的文件,然后重新排列列并使用to_csv 重写您的文件:

    import pandas as pd
    
    df = pd.read_csv(your_file)
    
    ncols = 3
    
    cols = df.columns[-ncols:].tolist() + df.columns[:-ncols].tolist()
    
    df[cols].to_csv(your_file)
    

    或一行:

    (pd.read_csv(your_file)
            [df.columns[-ncols:].tolist() + df.columns[:-ncols].tolist()]
       .to_csv(your_file, index=False)
    )
    

    演示:

    In [12]: ncols = 3
    
    In [13]: cols = df.columns[-ncols:].tolist() + df.columns[:-ncols].tolist()
    
    In [14]: cols
    Out[14]: ['E', 'F', 'G', 'A', 'B', 'C', 'D']
    
    In [15]: df
    Out[15]:
       A  B    C  D  E  F  G
    0  1  0  0.5  5  1  7  6
    1  2  0  0.6  4  0  7  6
    2  3  0  0.7  3  1  7  6
    3  4  0  0.8  2  0  7  6
    
    In [16]: df[cols]
    Out[16]:
       E  F  G  A  B    C  D
    0  1  7  6  1  0  0.5  5
    1  0  7  6  2  0  0.6  4
    2  1  7  6  3  0  0.7  3
    3  0  7  6  4  0  0.8  2
    

    【讨论】:

    • 这有效,但仅适用于小文件。在具有一千列的文件中,不可能写下所有列名。有没有更好的办法?
    • 您是否有定义重新索引列的方式的规则?
    • 不。我只想插入最后 5 列,例如 column no: 997,998,999,1000 到第 1、2、3 和 4 位,并将所有其他列向右移动。
    • @DigantaBharali,请不要低估 pandas - 它是一个非常强大的工具。我在 ysearka 的回答中添加了一个如何动态完成的示例。我想如果你的问题更具体一些,ysearka 会给你一个简洁的答案。
    • @MaxU,我从来没有低估过熊猫。我爱上了它。只是我是 python 和 pandas 的新手。所以我往往会在这里和那里卡住。您能否指导我了解与此相关的任何文件。
    猜你喜欢
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多