web-dev-qa-db-ja.com

pandas.DataFrame.from_dictがOrderedDictを使用して順序を保持しない

オランダ統計局(CBS)からデータベースにOData XMLデータフィードをインポートしたい。 lxmlとpandasを使用すると、これは簡単だと思いました。

_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でソートされていますか?

誰か助けて?

19
dkapitan

datalistであり、dictを持たないため、あなたの例の一部は矛盾しているように見えますが、実際にOrderedDictがあると仮定します。

DataFrameを作成するときに、列の順序を明示的に指定してみてください。

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

これにより、(data.keys()生成リストを介して)OrderedDictとまったく同じ順序で列が並べられたDataFrameが得られます。

28
chris-sc

上記の答えは私にとっては機能せず、「ValueError:orient = 'columns'でcolumnsパラメータを使用できません」と表示され続けます。

後で私はこれを以下で行うことで解決策を見つけて働きました:

df = pd.DataFrame.from_dict (dict_data) [list (dict_data[0].keys())]
0
Daniel Wu