2015-11-17 18 views
9

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ś?

Odpowiedz

17

Coś w przykładzie wydaje się być niespójne, jak data jest list i nie dict, ale zakładając, że naprawdę mają OrderedDict:

Spróbuj jednoznacznie określić swoją kolejność kolumn podczas tworzenia DataFrame:

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

To powinno dać swój DataFrame z kolumnami zamówionych właśnie w dokładnym sposobie ich w OrderedDict (poprzez generowanej listy data.keys())

+5

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

+0

Możesz także użyć bardziej zwięzłego 'columns = data', ponieważ iteracja po' danych' iteruje po klawiszach. –

Powiązane problemy