2016-06-23 12 views
1

私はcsvファイルを持っており、列インデックスを変更する必要があります。私の現在のファイルが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以上の列を持つファイルを持っています。ありがとう

答えて

3

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をコピーして、それを再配置することができます。

+0

これ小さなファイルに対してのみ動作します。 1000列のファイルでは、すべての列名を書き留めることはできません。より良い方法はありますか?最後の10列を1000列ファイルの前に持っていきたいとします。どのようなアプローチが必要ですか? –

+0

@DigantaBharaliこれはプログラマチックに行うことができます。あなたはすべての列名を持つリストであるreader.fieldnamesをコピーして、それをあなたが望むように整理します。 'old_column = reader.fieldnames; new_column = old_column [-10:0] + old_column [0:-10] ' – Sorin

1

その後、列の順序を変更し、to_csvを使用してファイルを書き換えるpandas.read_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) 

または1行で:

(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 
+0

これは小さなファイルに対してのみ有効です。 1000列のファイルでは、すべての列名を書き留めることはできません。より良い方法がありますか? –

+0

列を再インデックスする方法を定義するルールはありますか? – ysearka

+0

nope。私はちょうど最後の5列を挿入したいと思います。列番号:997,998,999,1000を1,2,3,4番目の位置に置き、他の列をすべて右にシフトします。 –

関連する問題