python导入pandas data_访问python子列表以导入到pandas DataFrame中

我正在尝试将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 | | | | | | | |

+---------------------------------------------------------------------------------------+

解决方法:

你需要“压扁”results.rows中包含的字典.在您的情况下,results [n](其中n是表示单个“记录”的基于零的索引)是包含嵌套dicts(用于键名和headshot)的dict.

在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)

请注意,使用此方法,嵌套列的键将通过将“父”键与嵌套字典中的键连接来派生,例如“name_first”,“name_last”.您可以自定义展平方法以更改它.

这里可以使用多种方法.关键的见解是你需要展平results.rows中包含的词典.

标签:python,pandas

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值