访问python子列表以导入pandas DataFram

2024-09-27 17:43:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将幻想篮球数据从yql导入到pandas数据框中,但是我遇到了嵌套内容的问题。在

yql的数据(结果.行)看起来像这样(当我使用类型时(结果.行)我得到清单)。在

{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'}

当我表演的时候

^{pr2}$

它可以很好地导入数据,但是headshot和name中的数据都是作为列和嵌套列表导入的。在

我可以从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         |       |             |            |       |      |      |            |
+---------------------------------------------------------------------------------------+

Tags: 数据keynamecomhttp列表asciiposition
1条回答
网友
1楼 · 发布于 2024-09-27 17:43:44

您需要“展平”包含在results.rows中的字典。在您的例子中,results[n](其中n是表示单个“记录”的从零开始的索引)是一个包含嵌套dict的dict(对于键nameheadshot)。在

this question中详细讨论了dicts的扁平化及其相关问题。在

一种可能的方法:

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)

注意,使用这种方法,嵌套列的键将通过将“parent”键与嵌套dict中的键(例如“name_first”、“name_last”)连接起来来派生。您可以自定义flatten方法来更改它。在

这里可以使用多种方法。关键的见解是您需要扁平化results.rows中包含的字典。在

相关问题 更多 >

    热门问题