【问题标题】:pandas.DataFrame.from_dict not preserving order using OrderedDictpandas.DataFrame.from_dict 不使用 OrderedDict 保留顺序
【发布时间】:2015-11-17 09:02:25
【问题描述】:

我想将来自荷兰统计局 (CBS) 的 OData XML 数据馈送导入我们的数据库。使用 lxml 和 pandas 我认为这应该是直截了当的。通过使用 OrderDict,我想保留列的顺序以提高可读性,但不知何故我无法正确处理。

from collections import OrderedDict
from lxml import etree
import requests
import pandas as pd


# CBS URLs
base_url = 'http://opendata.cbs.nl/ODataFeed/odata'
datasets = ['/37296ned', '/82245NED']

feed = requests.get(base_url + datasets[1] + '/TypedDataSet')
root = etree.fromstring(feed.content)

# all record entries start at tag m:properties, parse into data dict
data = []
for record in root.iter('{{{}}}properties'.format(root.nsmap['m'])):
    row = OrderedDict()
    for element in record:
        row[element.tag.split('}')[1]] = element.text
    data.append(row)

df = pd.DataFrame.from_dict(data)
df.columns

检查data,OrderDict 的顺序正确。但是看看df.head(),这些列是先用大写字母按字母顺序排序的吗?

帮忙,有人吗?

【问题讨论】:

    标签: python pandas python-collections


    【解决方案1】:

    您的示例中的某些内容似乎不一致,因为 data 是 list 而不是 dict,但假设您确实有 OrderedDict:

    尝试在创建 DataFrame 时明确指定列顺序:

    # ... all your data collection
    df = pd.DataFrame(data, columns=data.keys())
    

    这应该会为您提供 DataFrame,其中的列的排序方式与 OrderedDict 中的列完全一致(通过 data.keys() 生成的列表)

    【讨论】:

    • 感谢@chris-sc,这行得通。 data 是 OrderedDicts 的列表,因此实际上该列表中的每个项目都是一条记录。稍微修改您的解决方案df = pd.DataFrame(data, columns=data[0].keys())。然而,有点令人失望的是它不会自动推断出这一点,但这可能只是我......
    • 您也可以使用更简洁的columns=data,因为遍历data 会遍历键。
    • 在 python 3 中对我不起作用,除非 to_html 函数正在做一些事情,但我非常怀疑。
    • @user637338 你可以很容易地测试,对吧?它在普通 python 中看起来如何?我猜您正在使用 ipython 笔记本(因此是 to_html)-您可以在控制台中尝试一下,看看它是否仍然无法正常工作?
    【解决方案2】:

    上面的答案对我不起作用,并不断给我“ValueError: cannot use columns parameter with orient='columns'”。

    后来我通过以下操作找到了解决方案并工作:

    df = pd.DataFrame.from_dict (dict_data) [list (dict_data[0].keys())]
    

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 2016-09-25
      • 2014-07-20
      • 2013-03-21
      • 2016-11-08
      • 2017-09-04
      • 2014-01-21
      • 2018-02-16
      相关资源
      最近更新 更多