我想将荷兰统计局(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()
列已经按字母顺序排序,首先使用CAPS?
帮助,有人吗?
答案 0 :(得分:27)
您的示例中的某些内容似乎不一致,因为data
是list
而没有dict
,但假设您确实有OrderedDict
:
尝试在创建DataFrame时明确指定列顺序:
# ... all your data collection
df = pd.DataFrame(data, columns=data.keys())
这应该为您的DataFrame提供与OrderedDict中的排序完全相同的列(通过data.keys()
生成的列表)
答案 1 :(得分:0)
上面的答案对我不起作用,并不断给我“ ValueError:无法将Orient ='columns'的columns参数使用”。
后来,我通过下面的方法找到了解决方案并起作用:
onserverOn(Schedulers.io())