24

我想将来自荷兰统计局 (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()列是否首先使用大写字母按字母顺序排序?

帮助,有人吗?

4

2 回答 2

38

您的示例中的某些内容似乎不一致,dataalist和 no也是如此dict,但假设您确实有 a OrderedDict

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

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

这应该为您提供 DataFrame,其列的顺序与它们在 OrderedDict 中的顺序完全相同(通过data.keys()生成的列表)

于 2015-11-17T14:02:27.447 回答
1

上面的答案对我不起作用,并不断给我“ValueError:不能使用带有orient ='columns'的columns参数”。

后来我通过在下面执行此操作找到了解决方案并工作:

df = pd.DataFrame.from_dict (dict_data) [list (dict_data[0].keys())]
于 2019-07-28T05:54:34.993 回答