【问题标题】:Pandas DataFrame constructor sorts rows, even with OrderedDict as inputPandas DataFrame 构造函数对行进行排序,即使使用 OrderedDict 作为输入
【发布时间】:2021-01-13 10:49:14
【问题描述】:

我创建了一个 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})

结果是这样的:

它应该给出这个:

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

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

【问题讨论】:

  • 阅读源代码,init_dict 不会修改传递的数组的顺序,在许多其他不适用于您的情况的检查中,它会从字典键中提取列名。然后构造函数调用NDFrame.__init__,如果它可以帮助任何想要从那时起进行研究的人。

标签: python pandas dataframe ordereddict


【解决方案1】:

如果您想以与字典相同的顺序获取 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

frame source code 中唯一提到的OrderedDictdf.to_dict() 的示例,因此在这里没有用处。

似乎即使您传递的是有序结构,但一旦您将其包装在通用字典 {'values': od} 中并且 pandas 从 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

【讨论】:

  • 至于为什么会发生这种情况,您必须遵循该源代码中的解析类,希望有些人已经这样做并可以启发我们。
  • 用普通字典包起来是什么意思?
  • 有没有办法不将其包装在普通字典中? df = pd.DataFrame(data=od, columns=['values']) 之类的东西(不起作用)。 TypeError: Expected tuple, got str
  • 这里也不起作用:df = pd.DataFrame(od)。它给出了错误:ValueError: If using all scalar values, you must pass an index
  • 我实际上认为对索引进行排序是相当合理的,因为它是许多方法中的默认行为,如unstackreindex 和其他方法......如果有帮助,init_dict 会不对数据进行排序,它必须在堆栈的下方进行。但我不会担心它,只使用任何有效的方法,除非你想为自己的个人利益学习实际的 pandas 实现,如果你有时间,这不是一个坏主意。
猜你喜欢
  • 2019-11-26
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2011-12-23
  • 2018-07-03
  • 2016-09-14
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多