2012-10-28 40 views
4

我想從yql導入幻想籃球數據到一個熊貓數據框,但我遇到了嵌套內容的問題。訪問python子列表導入到熊貓DataFrame

來自yql(results.rows)的數據看起來像這樣(當我使用type(results.rows)我得到列表)。

{u'display_position': u'PF', 
u'editorial_player_key': u'nba.p.4175', 
u'editorial_team_abbr': u'Uta', 
u'editorial_team_full_name': u'Utah Jazz', 
u'editorial_team_key': u'nba.t.26', 
u'eligible_positions': {u'position': u'PF'}, 
u'headshot': {u'size': u'small', 
    u'url': u'http://l.yimg.com/iu/api/res/1.2/KjAPlP83IIrP9iReWfjyjw--/YXBwaWQ9eXZpZGVvO2NoPTIxNTtjcj0xO2N3PTE2NDtkeD0xO2R5PTE7Zmk9dWxjcm9wO2g9NjA7cT0xMDA7dz00Ng--/http://l.yimg.com/a/i/us/sp/v/nba/players_l/20101116/4175.jpg'}, 
    u'image_url': u'http://l.yimg.com/iu/api/res/1.2/KjAPlP83IIrP9iReWfjyjw--/YXBwaWQ9eXZpZGVvO2NoPTIxNTtjcj0xO2N3PTE2NDtkeD0xO2R5PTE7Zmk9dWxjcm9wO2g9NjA7cT0xMDA7dz00Ng--/http://l.yimg.com/a/i/us/sp/v/nba/players_l/20101116/4175.jpg', 
u'is_undroppable': u'0', 
u'name': {u'ascii_first': u'Paul', 
    u'ascii_last': u'Millsap', 
    u'first': u'Paul', 
    u'full': u'Paul Millsap', 
    u'last': u'Millsap'}, 
u'player_id': u'4175', 
u'player_key': u'304.p.4175', 
u'position_type': u'P', 
u'uniform_number': u'24'} 

當我執行

DataFrame(results.rows) 

它導入數據正常,但是在這兩個爆頭和名稱的數據導入爲他們的嵌套列表列。

我可以從IPython的訪問子表,但是當我試圖將其導入到一個數據幀我得到一個錯誤:

results[0]['name'] 

{u'ascii_first': u'Pau', 
u'ascii_last': u'Gasol', 
u'first': u'Pau', 
u'full': u'Pau Gasol', 
u'last': u'Gasol'} 

DataFrame([results[0]['name']) 

ValueError: If use all scalar values, must pass index 

,我想要的行爲是導入嵌套列表作爲自己的列,而而不是包含嵌套列表的列。我怎樣才能做到這一點?

,我想最終的結果是使用以下佈局的數據幀:

+---------------------------------------------------------------------------------------+ 
|display_position | (...) | ascii_first | ascii_last | first | full | last | player_id | 
+---------------------------------------------------------------------------------------+ 
| Data   |  |    |   |  |  |  |   | 
+---------------------------------------------------------------------------------------+ 
+0

你可以發佈結果應該是什麼樣子的模擬?從描述中不清楚你想要什麼。而且,你確定要使用DataFrame而不是Series? –

+0

當然 - 只是更新了問題。爲了說清楚,這個條目只是數據的一個例子,每個玩家都有更多的條目。 –

回答

2

你需要「扁平化」包含在results.rows的字典。在你的情況下,results[n](其中n是一個代表單個「記錄」的從零開始的索引)是一個包含嵌套字典的字典(對於鍵nameheadshot)。

扁平化的書稿已在this question及其相關問題中詳細討論。

一個可行的方法:

import collections 

def flatten(d, parent_key=''): 
    items = [] 
    for k, v in d.items(): 
     new_key = parent_key + '_' + k if parent_key else k 
     if isinstance(v, collections.MutableMapping): 
      items.extend(flatten(v, new_key).items()) 
     else: 
      items.append((new_key, v)) 
    return dict(items) 

flattened_records = [flatten(record) for record in results.rows] 
df = DataFrame(flattened_records) 

需要注意的是,使用這種方法時,嵌套列鍵將通過連接「父」鍵與鍵在嵌套的字典,例如「name_first」衍生「name_last」。您可以自定義flatten方法來更改該方法。

這裏可以使用多種方法。關鍵的見解是,你需要將包含在results.rows中的字典變平。

+0

非常感謝。我有一個想法,那就是我需要做的。我不完全理解這個函數,但是我確信一旦我增加了我的python技能,它就會很清楚這是如何工作的。同時我很高興它能夠工作! –