在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