4

ファンタジーバスケットボールのデータをyqlからパンダのデータフレームにインポートしようとしていますが、ネストされたコンテンツで問題が発生しています。

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

私が望む動作は、ネストされたリストを含む列としてではなく、ネストされたリストを独自の列としてインポートすることです。これどうやってするの?

私が望む最終結果は、次のレイアウトのDataFrameの場合です。

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

1 に答える 1

3

に含まれる辞書を「平坦化」する必要がありますresults.rows。あなたの場合、results[n]nは個々の「レコード」を表すゼロベースのインデックスです)は、ネストされた辞書(キーnameおよびの場合headshot)を含む辞書です。

辞書の平坦化については、この質問とそのリンクされた質問で詳しく説明されています。

1 つの可能なアプローチ:

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

于 2012-10-29T09:49:48.773 に答える