Pandas 从 OrderedDict 列表构建 DataFrame:保留列顺序

Pandas DataFrame construction from a list of OrderedDict: preserving columns order

pd.__version__ = 0.18.0

假设您有一个 list 的 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

确实保持列顺序。

我在 Whosebug 上了解到 0.11 中存在此类错误,但恕我直言,我们不必在默认构造函数中指定 columns= 选项。我是不是遗漏了什么,或者这是一个需要报告的错误?

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

试试这个:

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

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

自己动手....

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