【问题标题】:Convert dataframe to dictionary while preserving order在保留顺序的同时将数据框转换为字典
【发布时间】:2019-07-30 02:11:00
【问题描述】:

我有一个包含两列的数据框,我想将它们转换为字典以用作地图。
我尝试了多种转换方式,但我的字典值总是以错误的顺序出现。

这是我的数据框前几行的样子:

geozip.head()
Out[30]: 
    Geoid    ZIP
0  100100  36276
1  100124  36310
2  100460  35005
3  100460  35062
4  100460  35214

我希望我的字典看起来像这样:

{100100: 36276,
100124: 36310,
100460: 35005,
100460: 35062,
100460: 35214,...}

但相反,我的输出结果出现了错误的值顺序。

{100100: 98520,
 100124: 36310,
 100460: 57520,
 100484: 35540,
 100676: 19018,
 100820: 57311,
 100988: 15483,
 101132: 36861,...}

我先尝试了这个,但字典没有排序:

geozipmap = geozip.set_index('Geoid')['ZIP'].to_dict()

然后我尝试先将两列转换为列表然后转换为字典,但出现了同样的问题:

geoid = geozip.Geoid.tolist()
zipcode = geozip.ZIP.tolist()
geozipmap = dict(zip(geoid, zipcode))

我尝试转换为 OrderedDict,但也没有用。 然后我试过了:

geozipmap = {k: v for k, v in zip(geoid, zipcode)}

【问题讨论】:

  • 字典类型默认是无序的。你试过用有序的字典吗? docs.python.org/3/library/…
  • @ChrisDoyle,是的,我也尝试过,但没有成功。
  • 你检查过this anwer 吗?这与您遇到的问题相同。
  • 我也试过这个,我得到的错误信息是:“ValueError: orient 'ZIP' not understand”

标签: python-3.7


【解决方案1】:

pandas==0.25 中,您可以将OrderedDict 作为into 参数传递(正如@Chris Doyle 所指出的那样。下面是一个示例:

from collections import OrderedDict

geozipmap = cityplace.set_index('Geoid')['ZIP'].to_dict(into=OrderedDict)

geozipmap

Out[1]:
OrderedDict([(100100, 36276), (100124, 36310), (100460, 35214)])

【讨论】:

  • 我想可能是因为我的 python 版本,这对我也不起作用。
  • @lee 你知道你使用的是哪个pandas 版本吗?根据文档,甚至以前的版本都接受了它,因为pandas==0.21
  • @calestini 我的熊猫版本是0.23.4
  • 很奇怪。在the 0.23.4 docs 中,他们使用Ordered Dict 给出了一个具体示例,倒数第二个示例是您的用例
  • @calestini 我知道。我不知道为什么这不起作用。
猜你喜欢
  • 2020-04-08
  • 2012-05-05
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2020-01-27
  • 1970-01-01
相关资源
最近更新 更多