pandas.DataFrame.from_dict不使用OrderedDict保留顺序

dka*_*tan 21 python pandas python-collections

我想将荷兰统计局(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
Run Code Online (Sandbox Code Playgroud)

检查data,OrderDict的顺序正确.但是查看df.head()列已经按字母顺序排序,首先使用CAPS?

帮忙,有人吗?

chr*_*-sc 30

你的例子中的某些东西似乎是不一致的,因为dataa list和no dict,但假设你真的有OrderedDict:

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

# ... all your data collection
df = pd.DataFrame(data, columns=data.keys())
Run Code Online (Sandbox Code Playgroud)

这应该为您的DataFrame提供与OrderedDict中的列完全相同的列(通过data.keys()生成的列表)

  • 谢谢@ chris-sc,这很有效.`data`是OrderedDicts的列表,所以实际上该列表中的每个项目都是一条记录.对您的解决方案进行轻微修改`df = pd.DataFrame(data,columns = data [0] .keys())`.然而,有点令人失望的是它并没有自动推断出来,但这可能只是我...... (6认同)