如何合并拆分字典并生成单个Pandas DataFrame?
问题修复:从嵌套列表生成目标DataFrame
输入数据
l = [ {'name': 'foo', 'data': [{'id': 1}, {'type': 'type1'}, {'class': 'A'}]}, {'name': 'bar', 'data': [{'id': 2}, {'type': 'type2'}, {'class': 'B'}]} ]
中间目标字典
new_d = { 'name': ['foo', 'bar'], 'id': [1, 2], 'type': ['type1', 'type2'], 'class': ['A', 'B'] }
最终期望DataFrame输出
name id type class foo 1 type1 A bar 2 type2 B
错误代码及报错信息
你尝试的代码:
new_d = {} for d in l: new_d = {'name': d['name'], **d['data']} df = pd.DataFrame(new_d)
报错:
TypeError: 'list' object is not a mapping
问题原因
d['data']是列表类型,不能用**解包(**只能用于字典映射类型);- 循环中每次都会直接覆盖
new_d,没有实现数据收集的逻辑。
修复方案
方案一:先构建中间字典new_d
import pandas as pd l = [ {'name': 'foo', 'data': [{'id': 1}, {'type': 'type1'}, {'class': 'A'}]}, {'name': 'bar', 'data': [{'id': 2}, {'type': 'type2'}, {'class': 'B'}]} ] # 初始化目标字典的空列表 new_d = {'name': [], 'id': [], 'type': [], 'class': []} for item in l: # 收集name字段 new_d['name'].append(item['name']) # 把data列表中的多个小字典合并成一个完整字典 data_dict = {} for sub_dict in item['data']: data_dict.update(sub_dict) # 收集各个字段的值 new_d['id'].append(data_dict['id']) new_d['type'].append(data_dict['type']) new_d['class'].append(data_dict['class']) df = pd.DataFrame(new_d) print(df)
方案二:直接生成扁平字典列表(更简洁)
无需先构建new_d,直接把每个嵌套元素转换成扁平字典,再生成DataFrame:
import pandas as pd l = [ {'name': 'foo', 'data': [{'id': 1}, {'type': 'type1'}, {'class': 'A'}]}, {'name': 'bar', 'data': [{'id': 2}, {'type': 'type2'}, {'class': 'B'}]} ] flat_items = [] for item in l: # 初始化扁平字典,先放入name flat_dict = {'name': item['name']} # 合并data列表里的所有小字典 for sub_dict in item['data']: flat_dict.update(sub_dict) flat_items.append(flat_dict) df = pd.DataFrame(flat_items) print(df)
运行结果
两种方案都会输出你期望的DataFrame:
name id type class 0 foo 1 type1 A 1 bar 2 type2 B
内容的提问来源于stack exchange,提问作者user21474411
相关产品推荐
相关产品推荐

