Python Pandas DataFrame构造函数对行进行排序,即使使用OrderedDict作为输入也是如此

Python Pandas DataFrame构造函数对行进行排序,即使使用OrderedDict作为输入也是如此,python,pandas,dataframe,ordereddict,Python,Pandas,Dataframe,Ordereddict,我创建了一个OrderedICT: 从集合导入订单数据 od=OrderedDict([(2,9),0.5218), ((2, 0), 0.3647), ((3, 15), 0.3640), ((3, 8), 0.3323), ((2, 28), 0.3310), ((2, 15), 0.3281), ((2, 10), 0.2938), ((3, 9), 0.2719)]) 然后我将其输入pandas DataFrame构造函数: 将熊猫作为pd导入 df=pd.DataFrame({'va

我创建了一个OrderedICT:

从集合导入订单数据
od=OrderedDict([(2,9),0.5218),
((2, 0), 0.3647),
((3, 15), 0.3640),
((3, 8), 0.3323),
((2, 28), 0.3310),
((2, 15), 0.3281),
((2, 10), 0.2938),
((3, 9), 0.2719)])
然后我将其输入pandas DataFrame构造函数:

将熊猫作为pd导入
df=pd.DataFrame({'values':od})
结果是:

相反,它应该给出:

这里发生了什么我不明白的事

附言:我不是在寻找解决这个问题的替代方法(尽管如果你认为这对社区有帮助的话,欢迎你发布)。我只想知道为什么这里不起作用。这是一个bug,还是有一些逻辑?
这也不是重复的,因为我使用的是OrderedDict,而不是普通的dict。

如果您希望以与词典相同的顺序获取数据帧,您可以

df = pd.DataFrame(od.values(), index=od.keys(), columns=['values'])
输出

      values
2 9   0.5218
  0   0.3647
3 15  0.3640
  8   0.3323
2 28  0.3310
  15  0.3281
  10  0.2938
3 9   0.2719

中唯一提到的
OrderedDict
df.to_dict()
的示例,因此在这里没有用处

看起来,即使您正在传递一个有序结构,但默认情况下,当您将它包装到一个公共字典
{'values':od}
中并从OrderedDict获取其索引时,它也会被解析并重新排序

如果您也使用列标签(即json)构建字典,则此行为似乎被否决


至于为什么会发生这种情况,您必须遵循源代码中的解析类,希望一些will已经做到了这一点,并能给我们一些启示。将其包装在通用字典中是什么意思?有没有办法不将其包装在通用字典中?类似于
df=pd.DataFrame(data=od,columns=['values'])
(这不起作用)
TypeError:需要元组,得到str
这里也不起作用:
df=pd.DataFrame(od)
。它给出了错误:
ValueError:如果使用所有标量值,则必须传递一个索引
,我实际上认为对索引进行排序是非常合理的,因为这是许多方法中的默认行为,如
取消堆栈
重新索引
等。。。如果有帮助,
init_dict
不会对数据进行排序,则必须在堆栈的下一层进行排序。但我不会担心,只要能用就用,除非你想学习熊猫的实际实现是为了你自己的利益,如果你有时间的话这不是个坏主意。阅读源代码,不会修改数组传递的顺序,还有许多其他不适用于你的情况的检查,它从字典键中提取列名。然后构造器调用,如果它有助于任何想要从该点开始研究的人。
od = OrderedDict([
    ((2, 9), {'values':0.5218}),
    ((2, 0), {'values':0.3647}),
    ((3, 15), {'values':0.3640}),
    ((3, 8), {'values':0.3323}),
    ((2, 28), {'values':0.3310}),
    ((2, 15), {'values':0.3281}),
    ((2, 10), {'values':0.2938}),
    ((3, 9), {'values':0.2719})
])
df = pd.DataFrame(od).T
print(df)
      values
2 9   0.5218
  0   0.3647
3 15  0.3640
  8   0.3323
2 28  0.3310
  15  0.3281
  10  0.2938
3 9   0.2719