web-dev-qa-db-ja.com

pandas to_csvメソッドで列の順序を維持する

pandasのto_csvメソッドは、列の順序を保持しません。CSVで列をアルファベット順に配置することを選択します。これはバグであり、報告されており、バージョン0.11で修正される予定です。 0.私は0.18.0を持っています。

import pandas as pd
df = pd.DataFrame({'V_pod_error' : [a],
                   'V_pod_used' : [b],
                   'U_sol_type' : [c]
                                ...
                                ... and so on upto 50 columns }

pd.to_csv(df)

Excelの注文:

0   U_sol type          V_pod_error      V_pod_used      ...
1

私が欲しいのは辞書の順序です:

0   V_pod_error      V_pod_used          U_sol type     ...
1

私は膨大な数の列と名前を持っています。手動で行うことも、列の順序を書き出すこともできません。 2013年にもまったく同じ質問がありました here 。そして、アップデートがあるようには見えません!コミュニティに助けてもらいたいです!これは本当に問題があります。

14
Thej Kiran

次の解決策を試してください。私も同じ問題に直面しました。私はそれを次のように解決しました:

import pandas as pd
df = pd.DataFrame({'V_pod_error' : [a],
                   'V_pod_used' : [b],
                   'U_sol_type' : [c]
                                ...
                                ... and so on upto 50 columns }

column_order = ['V_pod_error', 'V_pod_used', 'U_sol_type',.....# upto 50 column names]

df[column_order].to_csv(file_name)
14

列のカスタム順序付けにはパラメーターDataFrameを追加する必要があるため、問題はcolumnsコンストラクターにあると思います。パラメータ列を設定しない場合、列は英数字順になります。

import pandas as pd
df = pd.DataFrame({'V_pod_error' : [0,2],
                   'V_pod_used' : [6,4],
                   'U_sol_type' : [7,8]})
print df
   U_sol_type  V_pod_error  V_pod_used
0           7            0           6
1           8            2           4

print df.to_csv()
,U_sol_type,V_pod_error,V_pod_used
0,7,0,6
1,8,2,4


df1 = pd.DataFrame({'V_pod_error' : [0,2],
                   'V_pod_used' : [6,4],
                   'U_sol_type' : [7,8]}, 
                    columns=['V_pod_error','V_pod_used','U_sol_type'])

print df1
   V_pod_error  V_pod_used  U_sol_type
0            0           6           7
1            2           4           8

print df1.to_csv()
,V_pod_error,V_pod_used,U_sol_type
0,0,6,7
1,2,4,8

編集:

別の解決策は、書き込み前にサブセットごとに列の順序を設定することです to_csv (ありがとう Mathias711 ):

import pandas as pd
df = pd.DataFrame({'V_pod_error' : [0,2],
                   'V_pod_used' : [6,4],
                   'U_sol_type' : [7,8]})
print df
   U_sol_type  V_pod_error  V_pod_used
0           7            0           6
1           8            2           4

df = df[['V_pod_error','V_pod_used','U_sol_type']]
print df

   V_pod_error  V_pod_used  U_sol_type
0            0           6           7
1            2           4           8

EDIT1:dictOrderedDictに変換してからDataFrameを作成するのに役立つかもしれません:

import collections
import pandas as pd


d = {'V_pod_error' : [0,2],'V_pod_used' : [6,4], 'U_sol_type' : [7,8]}
print d
{'V_pod_error': [0, 2], 'V_pod_used': [6, 4], 'U_sol_type': [7, 8]}

print pd.DataFrame(d)
   U_sol_type  V_pod_error  V_pod_used
0           7            0           6
1           8            2           4

d1 = collections.OrderedDict(d)
print d1
OrderedDict([('V_pod_error', [0, 2]), ('V_pod_used', [6, 4]), ('U_sol_type', [7, 8])])

print pd.DataFrame(d1)
   V_pod_error  V_pod_used  U_sol_type
0            0           6           7
1            2           4           8
10
jezrael

試してください:

df.to_csv(file_name, sep=',', encoding='utf-8', header=True, columns=["Col1","Col2","Col3","Col4"])

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html

3
Biranchi