Python Pandasを使用して読み取りおよび書き込みを行うときに、csvファイルの列の順序を保持する方法はありますか?たとえば、このコードでは
import pandas as pd
data = pd.read_csv(filename)
data.to_csv(filename)
列が保持されないため、出力ファイルが異なる場合があります。
現在のバージョンのPandas( '0.11.0')にはバグがあるようです。これは、MattiJohnの回答が機能しないことを意味します。ファイルに書き込む列を指定すると、それらはアルファベット順に書き込まれますが、列のリストに従って単純にラベルが付け直されます。たとえば、次のコードは次のとおりです。
import pandas
dfdict={}
dfdict["a"]=[1,2,3,4]
dfdict["b"]=[5,6,7,8]
dfdict["c"]=[9,10,11,12]
df=pandas.DataFrame(dfdict)
df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"])
この(誤った)出力になります:
b a c
0 1 5 9
1 2 6 10
2 3 7 11
3 4 8 12
次のコマンドを実行して、インストールしたパンダのバージョンを確認できます。
pandas.version.version
to_csvのドキュメントはこちら
実際、これは既知のバグのようで、次のリリース(0.11.1)で修正される予定です。
https://github.com/pydata/pandas/issues/3489
更新:パンダの新しいリリースはまだありませんが、ここで説明されている回避策があり、別のバージョンのパンダを使用する必要はありません。
github.com/pydata/pandas/issues/3454
したがって、上記のコードブロックの最後の行を次のように変更すると、正しく機能します。
df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"], engine='python')
更新最近のバージョンのパンダでは、引数「cols」の名前が「columns」に変更され、引数「engine」が廃止された(使用できなくなった)ようです。また、このバグはバージョン0.19.0で修正されています。
このようなcsvファイルを読み書きするときは、通常、列の順序を保持する必要がありますが、何らかの理由で列の順序が希望どおりでない場合は、でcolumns
キーワード引数を使用できますto_csv
。
たとえば、列a、b、c、dのあるcsvがある場合:
data = pd.read_csv(filename)
data.to_csv(filename, columns=['a', 'b', 'c', 'd'])
別の回避策はこれを行うことです:
import pandas as pd
data = pd.read_csv(filename)
data2 = df[['A','B','C']] #put 'A' 'B' 'C' in the desired order
data2.to_csv(filename)