【问题标题】:Preserving column order in the pandas to_csv method在 pandas to_csv 方法中保留列顺序
【发布时间】:2016-09-01 10:21:19
【问题描述】:

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 也有完全相同的问题。而且看起来好像没有更新!我想请社区帮助我!这确实是个问题。

【问题讨论】:

  • 是的,我正在使用上述命令循环构建数据框。将检查有序的字典。谢谢。问题是,当我需要东西时,我会以一种快速而肮脏的方式不断更新。现在使用它真的很难。为了在末尾添加一列,我在列名前加上“z”(又快又脏)。对我现有的代码进行简单操作以获得所需的定义输出的任何其他建议?

标签: python excel csv pandas


【解决方案1】:

尝试以下解决方案。即使我面临同样的问题。我解决了如下:

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)

【讨论】:

    【解决方案2】:

    尝试:

    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】:

      我认为问题出在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:也许帮助先将dict 转换为OrderedDict,然后创建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
      

      【讨论】:

      • df.to_csv() 之前拨打df = df[[columns]] 是否也有帮助?通常这会改变你的列的顺序
      • 是的,这是另一种选择。谢谢。我添加它来回答。
      • @jexrael 感谢您的即时回复。但是,我不确定我们是否在同一页面上。我知道我们需要手动完成。但是我不想通过写出列结构来手动完成,因为我有太多列。我希望保留数据框列结构。我希望数据框中的内容能够毫不费力地显示在 csv 中。
      • @Mathias711 你是说如果我做 df = "df[[columns]]" (和你写的完全一样的话),那么它应该工作吗?我只是想知道“df = df[[columns]]”是否意味着 df[[col1,col2,col3]]。
      • @ThejKiran - 但我认为这是另一个问题 - 如何将列类型更改为自定义?因为如果创建没有参数列的数据框,它们是字母数字排序的。什么是自定义排序规则?我认为只帮助 Mathias 解决方案,请参阅我的答案中的编辑。顺便说一句,用于创建 DataFrame 是使用 Dictionary,所以在默认字典中排序是不可能的。
      猜你喜欢
      • 2013-03-17
      • 2015-12-08
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 2015-12-28
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多