【问题标题】:Pandas DataFrame construction from a list of OrderedDict: preserving columns order从 OrderedDict 列表构建 Pandas DataFrame:保留列顺序
【发布时间】:2016-09-25 20:49:32
【问题描述】:

pd.__version__ = 0.18.0

假设您有一个 OrderedDict 的列表

[OrderedDict([('SecurityCode', 'IDX.MSDENON'), ('DescriptionLong', 'MSCI Norway NR USD (EUR)'), ('DataSrc', 'BGN.COB'), ('Ticker', 'MSDENON Index'), ('LastRun', None)])]

如果您从默认构造函数(甚至使用 .from_dict() 方法)构造 DataFrame

df = pd.DataFrame(mylist) 

它不保留列顺序:

      DataSrc  DescriptionLong    LastRun SecurityCode         Ticker  
   0  BGN.COB  MSCI Norway NR USD (EUR)    None  IDX.MSDENON  MSDENON Index

而:

df = pd.DataFrame(data, columns=data[0].keys())

     SecurityCode           DescriptionLong  DataSrc         Ticker LastRun
  0  IDX.MSDENON  MSCI Norway NR USD (EUR)  BGN.COB  MSDENON Index    None

确实保持列顺序。

我在 StackOverflow 上读到这样的错误存在于 0.11 中,但恕我直言,我们不应该在默认构造函数中指定 columns= 选项。是我遗漏了什么还是需要报告的错误?

编辑: pydata/pandas repo 上的 github 问题已创建并被接受。这是默认构造函数中的一个“错误”,在任何情况下都会覆盖 OrderedDict 列顺序。已计划对下一个主要版本进行更正(0.18.2 接受提交)

【问题讨论】:

  • 0.18.1 中仍然可以这样工作,您可以更新问题或在 github 上发表评论
  • 如果列表中的第二个 OrderedDict 具有不同的顺序,您希望发生什么?让您指定要使用第一个值的顺序是否有意义?
  • 那些 OrderedDict 是在 SQL 查询之后创建的,所以 order 是为所有定义一次的

标签: python python-3.x pandas dataframe ordereddictionary


【解决方案1】:

试试这个:

df = pd.DataFrame.from_dict(data[0], orient='index').T

【讨论】:

    【解决方案2】:

    这确实是 DataFrame 构造函数的问题(参见我的编辑)。
    我觉得 columns= option 解决方法比 hhbilly 提出的解决方案更好(在语法上更容易理解)。

    【讨论】:

      【解决方案3】:

      自己动手……

      newList = list()
      columnNames = df.columns
      for index, row in df.iterrows():
          newDict = OrderedDict()
          for key in columnNames:
              newDict[key] = row[key]
          newList.append(newDict)
      

      【讨论】:

        猜你喜欢
        • 2013-03-17
        • 2014-12-01
        • 2022-07-28
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        • 2016-09-01
        • 2015-03-09
        相关资源
        最近更新 更多