在pandas to_csv方法中保留列顺序

pandas的to_csv方法不保留列的顺序。 它select按字母顺序排列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年, 这里也出现了同样的问题。 它看起来不像有更新! 我想请求社区帮助我! 这确实是有问题的。

尝试以下解决scheme。 即使我面临同样的问题。 我解决它如下:

 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_to_save[column_order].to_csv(df) 

我认为问题是在DataFrame构造函数中,因为您需要为columns的自定义sorting添加参数列。 如果您不设置参数列,列按字母顺序排列。

 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 

编辑:

另一个解决scheme是在写to_csv之前设置按子集顺序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 

编辑1:也许帮助首先将dict转换为OrderedDict ,然后创buildDataFrame

 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 

试试:

 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