Python 从OrderedDict列表构造数据帧:保留列顺序
pd.\uuuuu版本\uuuuu=0.18.0 假设您有一个OrderedICT列表: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()方法)构造数据帧
[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)