2016-01-15 40 views
1

我有什麼似乎是包含OrderedDict在我所指的子集內的OrderdDict,因爲它是'main'OrderedDict。我試圖將這個對象解析爲一個Pandas DataFrame。 (我正在使用Python 3,Anaconda發行版。)Python:將OrderedDicts的OrderedDict解析爲熊貓數據框

我已經搜索並找到了一些關於這些數據結構理解的示例,但示例中的結構似乎不匹配我的。

正如你在下面的例子中看到的,我關心的OrderedDicts嵌套在'main'OrderedDict中的一個名爲'records'的鍵中。我想借下面的例子:

od = OrderedDict([('totalSize', 3), ('done', True), ('records', [OrderedDict([('attributes', OrderedDict([('type', 'Cust'), ('url', '/example/url/foo/bar/123')])), ('Id', '4563456kjgfu4uyHHY3'), ('Phone', None), ('FirstName', 'Bill'), ('LastName', 'Bob'), ('Email', '[email protected]')]), OrderedDict([('attributes', OrderedDict([('type', 'Cust'), ('url', '/example/url/foo/bar/234')])), ('Id', 'KJ23jdkd889DKJD'), ('Phone', '(444) 444-4444'), ('FirstName', 'Amanda'), ('LastName', 'Smith'), ('Email', '[email protected]')]), OrderedDict([('attributes', OrderedDict([('type', 'Cust'), ('url', '/example/url/foo/bar/654')])), ('Id', '23kkjKJkj2323KJ33'), ('Phone', '(555) 555-5555'), ('FirstName', 'Julie'), ('LastName', 'jackson'), ('Email', '[email protected]')])])])

...並獲得數據框與列「ID」,「電話」,「名字」,「姓氏」和「電子郵件」。

到目前爲止,我已經能夠提取什麼,我認爲是一個列表的列表:

li = [] 
list1 = [(record['Id'], record['Phone'],record['FirstName'],record['LastName']) 
for record in od['records']] 
li.append(list1) 
li[:] 

名單戰略的這份名單,但忽略列名的可能性。我想請你幫忙把這個方法變成熊貓DataFrame的最後一步。

非常感謝您提前。

回答

0

我對Pandas DataFrame並不熟悉,但構建一個列表字典似乎是一件適當的事情。

# Attributes of interest 
attrs = ['Id', 'Phone', 'FirstName', 'LastName', 'Email'] 
records = od['records'] 

data = {} 

for rec in records: 
    for k in attrs: 
     # setdefault initializes the array for key if necessary 
     data.setdefault(k, []).append(rec[k]) 

dframe = pandas.DataFrame(data) 

print(dframe) 

不需要指定字段的解決方案。 attributes被忽略,因爲它沒有被指定如何處理它,儘管它可能像其他處理一樣。

records = od['records'] 
data = {} 

for rec in records: 
    for k, v in rec.items(): 
     if k == 'attributes': 
      continue 
     data.setdefault(k, []).append(v) 

dframe = pandas.DataFrame(data) 
print(dframe) 
+0

謝謝!我試圖投票,但還沒有這樣的聲望。我會標記爲已解決,但解決方案需要手動聲明列Id的列表。能夠動態地提取列ID而不必指定它們是理想的。 我知道我沒有具體說明這是一個需求,所以如果沒有人提出解決方案,我會標記爲已解決。再次感謝你。 – gpanda

+0

@gpanda我添加了一個不需要指定列名的版本 –

+0

Brilliant,這非常有幫助,謝謝。 對於任何試圖解析simple-salesforce返回的數據的人來說,這將是一個很好的解決方案。 – gpanda