如何将嵌套列表字典的字典转换为指定格式的DataFrame?
将嵌套字典转换为指定格式DataFrame的实现方案
注:你提供的原始字典存在语法错误,
'2'对应的列表部分多了一个闭合花括号,已先修正为合法的Python字典格式。
方法一:遍历构造数据列表(直观易懂)
先遍历字典的每个step键和对应的医院数据列表,给每个医院的字典添加step字段,收集所有数据后再转换为DataFrame:
import pandas as pd # 修正后的合法字典 data_dict = { '1': [ {'name': 'Hospital 0', 'students': 5, 'grad': 71}, {'name': 'Hospital 1', 'students': 8, 'grad': 74} ], '2': [ {'name': 'Hospital 0', 'students': 11, 'grad': 72}, {'name': 'Hospital 1', 'students': 10, 'grad': 78} ] } # 收集所有带step字段的数据记录 records = [] for step, hospitals in data_dict.items(): for hosp in hospitals: # 复制原字典并添加step字段,避免修改原数据 record = hosp.copy() record['step'] = step records.append(record) # 转换为DataFrame并指定列顺序 df = pd.DataFrame(records, columns=['step', 'name', 'students', 'grad']) print(df)
方法二:使用列表推导式简化代码
和方法一逻辑一致,但用列表推导式压缩代码,更简洁:
import pandas as pd data_dict = { '1': [ {'name': 'Hospital 0', 'students': 5, 'grad': 71}, {'name': 'Hospital 1', 'students': 8, 'grad': 74} ], '2': [ {'name': 'Hospital 0', 'students': 11, 'grad': 72}, {'name': 'Hospital 1', 'students': 10, 'grad': 78} ] } # 用列表推导式生成所有记录 records = [{**hosp, 'step': step} for step, hospitals in data_dict.items() for hosp in hospitals] df = pd.DataFrame(records, columns=['step', 'name', 'students', 'grad']) print(df)
方法三:利用pandas内置方法实现
借助pandas的from_dict和多层索引展开功能,适合熟悉pandas高级操作的场景:
import pandas as pd data_dict = { '1': [ {'name': 'Hospital 0', 'students': 5, 'grad': 71}, {'name': 'Hospital 1', 'students': 8, 'grad': 74} ], '2': [ {'name': 'Hospital 0', 'students': 11, 'grad': 72}, {'name': 'Hospital 1', 'students': 10, 'grad': 78} ] } # 将每个step的列表转为子DataFrame,合并成多层索引结构 df = pd.DataFrame.from_dict({k: pd.DataFrame(v) for k, v in data_dict.items()}, orient='index') # 展开多层索引并重置列名 df = df.stack().apply(pd.Series).reset_index(level=0, names=['step']).reset_index(drop=True) # 调整列顺序为目标格式 df = df[['step', 'name', 'students', 'grad']] print(df)
以上三种方法最终都会生成你需要的DataFrame格式,输出如下:
| step | name | students | grad |
|---|---|---|---|
| 1 | Hospital 0 | 5 | 71 |
| 1 | Hospital 1 | 8 | 74 |
| 2 | Hospital 0 | 11 | 72 |
| 2 | Hospital 1 | 10 | 78 |
内容的提问来源于stack exchange,提问作者user19678327
相关产品推荐
相关产品推荐

