Desidero importare i dati XML OData dall'ufficio di statistica olandese (CBS) nel nostro database. Usando lxml e panda ho pensato che questo dovrebbe essere straigtforward. Usando OrderDict voglio mantenere l'ordine delle colonne per la leggibilità, ma in qualche modo non riesco a farlo bene.pandas.DataFrame.from_dict che non conserva l'ordine utilizzando OrderedDict
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
Ispezione data
, l'OrderDict è nel giusto ordine. Ma guardando df.head()
le colonne sono state ordinate alfabeticamente con CAPS prima?
Aiuto, qualcuno?
grazie @ chris-sc, funziona. Il 'data' è una lista di OrderedDicts, quindi in effetti ogni elemento in quell'elenco è un record. Leggera modifica della soluzione 'df = pd.DataFrame (data, columns = data [0] .keys())'. Eppure, un po 'deludente che non lo deduca automaticamente, ma quello potrebbe essere solo io ... – dkapitan
Puoi anche andare con il più conciso 'columns = data' dato che l'iterazione su' data' scorre sui tasti. –