保留pandas to_csv方法中的列顺序

The*_*ran 14 python csv excel pandas

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)
Run Code Online (Sandbox Code Playgroud)

Excel订单:

0   U_sol type          V_pod_error      V_pod_used      ...
1
Run Code Online (Sandbox Code Playgroud)

我想要的是字典中的顺序:

0   V_pod_error      V_pod_used          U_sol type     ...
1
Run Code Online (Sandbox Code Playgroud)

我有大量的专栏和名字.我无法手动完成或写出列顺序.已经有2013年的确切同样的问题在这里.并且看起来没有更新!我想请社区帮助我!这确实有问题.

Sar*_*thy 14

尝试以下解决方案.即使我遇到同样的问题.我解决了如下:

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)
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 10

我认为问题在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
Run Code Online (Sandbox Code Playgroud)

编辑:

另一种解决方案是在写入之前按列设置列的顺序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
Run Code Online (Sandbox Code Playgroud)

编辑1:也许帮助首先转换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
Run Code Online (Sandbox Code Playgroud)