2015-11-17 2 views
9

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?

risposta

17

Qualcosa nel tuo esempio sembra essere incoerente, come data è un list e non dict, ma a patto di avere davvero un OrderedDict:

Provare a specificare esplicitamente l'ordine di colonna quando si crea il dataframe:

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

Questo dovrebbe dare il vostro dataframe con le colonne ordinate solo nel precisa il modo in cui sono in OrderedDict (tramite la lista generata data.keys())

+5

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

+0

Puoi anche andare con il più conciso 'columns = data' dato che l'iterazione su' data' scorre sui tasti. –