Chcę importować dane OData XML z holenderskiego biura statystyk (CBS) do naszej bazy danych. Używając lxml i pand, pomyślałem, że to powinno być proste. Używając OrderDict, chcę zachować kolejność kolumn dla czytelności, ale jakoś nie mogę tego naprawić.pandas.DataFrame.from_dict nie zachowuje zamówienia za pomocą 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
Kontrola data
The OrderDict jest we właściwej kolejności. Ale patrząc na df.head()
kolumny zostały posortowane alfabetycznie najpierw za pomocą CAPS?
Pomoc, ktoś?
dzięki @ chris-sc, to działa. 'Dane' jest listą OrderedDicts, więc w rzeczywistości każdy element na tej liście jest rekordem. Niewielka modyfikacja twojego rozwiązania 'df = pd.DataFrame (dane, columns = dane [0] .keys())'. Jednak trochę rozczarowujące, że nie wnioskuje o tym automatycznie, ale to może być tylko ja ... – dkapitan
Możesz także użyć bardziej zwięzłego 'columns = data', ponieważ iteracja po' danych' iteruje po klawiszach. –