Python 在CSV文件中交换列

Python 在CSV文件中交换列,python,python-2.7,numpy,pandas,Python,Python 2.7,Numpy,Pandas,我有一个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

我有一个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多列的文件。谢谢

使用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
并重新设置其范围。

使用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
并重新设置其范围。

您可以使用
pandas读取文件。读取\u csv
,然后对列重新排序,并使用
将文件重写为\u 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)
)
演示:


您可以使用
pandas读取文件。读取\u csv
,然后对列重新排序,并使用
将文件重写为\u 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)
)
演示:


这是可行的,但只适用于小文件。在一个有一千列的文件中,不可能写下所有的列名。有更好的方法吗?你有规则来定义你重新索引列的方式吗?没有。我只想插入最后5列,说列号:9979989991000到第1、第2、第3和第4个位置,然后将所有其他列向右移动。@DigantaBharali,请不要低估熊猫-这是一个非常强大的工具。我在ysearka的答案中添加了一个例子,说明如何动态地完成它。我想如果你能更具体地回答问题,伊萨卡会给你一个简洁的答案。@MaxU,我从来没有低估过熊猫。我爱上了它。只是我对蟒蛇和熊猫还不熟悉。因此,我往往被困在这里和那里。你能不能给我一些与此相关的文档。这只适用于一个小文件。在一个有一千列的文件中,不可能写下所有的列名。有更好的方法吗?你有规则来定义你重新索引列的方式吗?没有。我只想插入最后5列,说列号:9979989991000到第1、第2、第3和第4个位置,然后将所有其他列向右移动。@DigantaBharali,请不要低估熊猫-这是一个非常强大的工具。我在ysearka的答案中添加了一个例子,说明如何动态地完成它。我想如果你能更具体地回答问题,伊萨卡会给你一个简洁的答案。@MaxU,我从来没有低估过熊猫。我爱上了它。只是我对蟒蛇和熊猫还不熟悉。因此,我往往被困在这里和那里。你能不能给我一些与此相关的文档。这只适用于一个小文件。在一个有一千列的文件中,不可能写下所有的列名。有更好的方法吗?假设我想把最后10列放在1000列文件的前面。应该采用什么方法?@DigantaBharali您可以通过编程方式,复制reader.fieldnames,这是一个包含所有列名的列表,然后按照您的意愿排列
old\u column=reader.fieldnames;new_column=old_column[-10:0]+old_column[0:-10]
此选项适用于小文件。在一个有一千列的文件中,不可能写下所有的列名。有更好的方法吗?假设我想把最后10列放在1000列文件的前面。应该采用什么方法?@DigantaBharali您可以通过编程方式,复制reader.fieldnames,这是一个包含所有列名的列表,然后按照您的意愿排列
old\u column=reader.fieldnames;新列=旧列[-10:0]+旧列[0:-10]