【问题标题】:DataFrame to List of OrderedDicts - how to preserve order?DataFrame 到 OrderedDicts 列表 - 如何保留订单?
【发布时间】:2021-02-18 04:15:34
【问题描述】:

当使用to_dictintoDataFrame 转换为OrderedDict 时,我找不到让它保持记录顺序的方法。有没有办法在不循环记录和手动转换的情况下做到这一点?

DataFrame([{"B": 1, "A": 2}]).to_dict(orient='records', into=OrderedDict)
> [OrderedDict([('A', 2), ('B', 1)])]

更新: 无法在我的调试器之外重现。我认为python的 pprint 模块正在丢弃订单。这也是我第一次开始进入这个兔子洞的方式 - 我没有注意到我的订购问题只是在我将数据打印到控制台后才开始。我认为 VS Code python 插件也在显示调试控制台输出之前以某种方式使用 pprint ,这再次丢弃了订单。我将关闭这个问题,非常抱歉浪费了您的时间!

【问题讨论】:

  • 你使用python 2还是python 3?看起来问题出在DataFrame([{"B": 1, "A": 2}]) 中,其中{"B": 1, "A": 2} 是一个字典,并且在低于3.6 的python 版本中,不能保证保持插入顺序。因此,您最终创建了一个数据框,该数据框可能具有您在最终输出中看到的 ('A', 2), ('B', 1) 顺序。
  • 谢谢。它是 python 3.8 - 所以这不应该是问题。
  • 有趣。我无法在 python 3.8 上重现您的问题。
  • 你有哪个熊猫版本?我有 1.1.2
  • 我试图在输入端保证它,但我使用 OrderedDict 的次数越多,我就越困惑...in_dict = OrderedDict([('B', 1), ('A', 2)])print(in_dict) --> OrderedDict([('A', 2), ('B', 1)]) 什么给了?还有什么方法可以用保证的顺序来初始化它?

标签: python pandas ordereddict


【解决方案1】:

成功的关键是传递一个初始化的实例,而不仅仅是一个类。

将您的代码更改为:

from collections import OrderedDict

dd = OrderedDict()
result = df.to_dict('records', into=dd)

其实你可以用defaultdict得到几乎一样的结果 (也从 collections 导入):

dd = defaultdict(list)
result = df.to_dict('records', into=dd)

【讨论】:

  • 这是为什么呢? official docs 建议你可以使用into=OrderedDict
  • 您提到的文档包含:可以是实际类或空实例。稍后提到 collections.defaultdict,并附上 您必须将其初始化。我认为 OrderedDict 也是如此,结果证明我是对的。
  • 官方文档明确使用df.to_dict(into=OrderedDict) 作为示例,并明确指出只应初始化 defaultdict。 (即If you want a defaultdict, you need to initialize it)。
  • 如果您认为文档有误,也许值得在他们的 github 中使用opening an issue
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2013-01-10
  • 2016-09-25
相关资源
最近更新 更多