Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从OrderedDict列表构造数据帧:保留列顺序_Python_Python 3.x_Pandas_Dataframe_Ordereddictionary - Fatal编程技术网

Python 从OrderedDict列表构造数据帧:保留列顺序

Python 从OrderedDict列表构造数据帧:保留列顺序,python,python-3.x,pandas,dataframe,ordereddictionary,Python,Python 3.x,Pandas,Dataframe,Ordereddictionary,pd.\uuuuu版本\uuuuu=0.18.0 假设您有一个OrderedICT列表: [OrderedDict([('SecurityCode', 'IDX.MSDENON'), ('DescriptionLong', 'MSCI Norway NR USD (EUR)'), ('DataSrc', 'BGN.COB'), ('Ticker', 'MSDENON Index'), ('LastRun', None)])] 如果从默认构造函数(甚至使用.from_dict()方法)构造数据帧

pd.\uuuuu版本\uuuuu=0.18.0

假设您有一个OrderedICT列表:

[OrderedDict([('SecurityCode', 'IDX.MSDENON'), ('DescriptionLong', 'MSCI Norway NR USD (EUR)'), ('DataSrc', 'BGN.COB'), ('Ticker', 'MSDENON Index'), ('LastRun', None)])]
如果从默认构造函数(甚至使用.from_dict()方法)构造数据帧

它不保留列顺序:

      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=option。我是否遗漏了什么,或者是一个需要报告的bug

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

尝试以下操作:

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

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

自己动手

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

0.18.1
中仍然如此,您可以更新问题或在Github上发表评论如果列表中的第二个排序信息具有不同的顺序,您希望发生什么?让您指定要使用第一个值的顺序难道没有意义吗?这些OrderedDict是在SQL查询之后创建的,所以order是一次性定义的
newList = list()
columnNames = df.columns
for index, row in df.iterrows():
    newDict = OrderedDict()
    for key in columnNames:
        newDict[key] = row[key]
    newList.append(newDict)