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

时间:2016-05-27 13:27:20

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

pd .__ version__ = 0.18.0

假设您有OrderedDict的列表

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

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

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问题。它是一个" bug"在默认构造函数中,在任何情况下都会覆盖OrderedDict列顺序。已经为下一个主要版本(接受0.18.2的提交)计划了修正

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

滚动您自己的....

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