首页 > 解决方案 > Pandas DataFrame 构造函数对行进行排序,即使使用 OrderedDict 作为输入

问题描述

我创建了一个 OrderedDict:

from collections import OrderedDict

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 构造函数中:

import pandas as pd

df = pd.DataFrame({'values': od})

结果是这样的:

在此处输入图像描述

相反,它应该给出这个:

在此处输入图像描述

我不明白这里发生了什么?

PS:我不是在寻找解决问题的替代方法(尽管如果您认为它会对社区有所帮助,欢迎您发布它)。我只想了解为什么这里不起作用。这是一个错误,还是有一些逻辑?这也不是此链接的副本,因为我专门使用的是 OrderedDict 而不是普通的字典。

标签: pythonpandasdataframeordereddict

解决方案


如果您想以与字典相同的顺序获取 DataFrame,您可以

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 获取它的索引,它就会被默认解析和重新排序。

如果您也使用列标签构建字典(à la json),这种行为似乎被否决了。

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

推荐阅读