Pandas从含字典列表的嵌套结构中提取目标值的解决方法
提取目标值的解决方法
报错原因
你遇到TypeError: list indices must be integers or slices, not str的核心原因是忽略了原始数据的两层列表嵌套结构:
原始数据:
[{'characters': [{'id': 'Spongebob Squarepants', 'name': 'Spongebob Squarepants'}]}]
- 最外层是列表结构,必须先用整数索引取第0个元素,才能拿到存储
characters字段的字典 characters字段对应的取值仍是列表结构,需要再用整数索引取第0个元素,才能拿到存储id和name的字典
原生Python直接提取方法
直接按层级访问即可拿到目标值:
# 取id字段 target = data[0]['characters'][0]['id'] # 取name字段 target = data[0]['characters'][0]['name']
DataFrame场景下的处理方案
存入DataFrame时默认把嵌套列表/字典当成单个对象存储,才会显示完整的结构字符串,两种处理方式可选:
方案1:存入前先展开数据(推荐)
提前把嵌套结构打平再存入DataFrame,后续使用更方便:
import pandas as pd data = [{'characters': [{'id': 'Spongebob Squarepants', 'name': 'Spongebob Squarepants'}]}] processed = [] for item in data: # 遍历characters列表中的所有角色 for char in item['characters']: processed.append(char) df = pd.DataFrame(processed) # 此时df的id、name列直接存储目标值
方案2:已存入DataFrame后提取
如果数据已经存入DataFrame,对应列名为characters,可以按如下方式提取:
# 如果列存储的是字符串,先转成Python对象(eval仅可用于可信数据源) df['characters'] = df['characters'].apply(eval) # 提取id df['char_id'] = df['characters'].str[0].str['id'] # 提取name df['char_name'] = df['characters'].str[0].str['name']
内容的提问来源于stack exchange,提问作者yakult_is_life
相关产品推荐
相关产品推荐

