访问 python 子列表以导入 pandas DataFrame
Posted
技术标签:
【中文标题】访问 python 子列表以导入 pandas DataFrame【英文标题】:Accessing python sub list to import into pandas DataFrame 【发布时间】:2012-10-17 19:34:43 【问题描述】:我正在尝试将梦幻篮球数据从 yql 导入 pandas 数据框,但我遇到了嵌套内容的问题。
来自 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)
它可以很好地导入数据,但是 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
我想要的行为是将嵌套列表导入为它们自己的列,而不是作为包含嵌套列表的列。我该怎么做?
我想要的最终结果是具有以下布局的 DataFrame:
+---------------------------------------------------------------------------------------+
|display_position | (...) | ascii_first | ascii_last | first | full | last | player_id |
+---------------------------------------------------------------------------------------+
| Data | | | | | | | |
+---------------------------------------------------------------------------------------+
【问题讨论】:
你能发布一个结果应该是什么样子的模型吗?从您的描述中不清楚您想要什么。此外,您确定要使用 DataFrame 而不是 Series? 当然 - 刚刚更新了问题。为了清楚起见,这个条目只是数据的一个例子,每个玩家还有很多条目。 【参考方案1】:您需要“展平”results.rows
中包含的字典。在您的情况下,results[n]
(其中 n
是一个从零开始的索引,表示单个“记录”)是一个包含嵌套字典的字典(对于键 name
和 headshot
)。
在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
中包含的字典。
【讨论】:
非常感谢。我有一个预感,那就是我需要做的。我并不完全理解这个功能,但我敢肯定,一旦我提高了我的 python 技能,我就会清楚它是如何工作的。与此同时,我很高兴它确实有效!以上是关于访问 python 子列表以导入 pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
Python:从列表中删除逗号,以便我可以使用 pandas 将数据导入 Excel 中的单独单元格
当 pandas 是导入时,Cx_freeze TypeError 只能连接列表(不是“NoneType”)以使用 numpy 依赖项列出