如何从含列表的嵌套字典创建指定格式的Pandas DataFrame?
解决方案:将嵌套字典转换为指定格式的DataFrame/CSV
目标格式
需要生成的DataFrame/CSV结构如下:
| App | id | stages | requestCpu | requestMemory |
|---|---|---|---|---|
| appName | 123 | dev | 1000 | 1024 |
| appName | 123 | staging | 3200 | 1024 |
| appName2 | 456 | dev | 2000 | 2048 |
| appName2 | 456 | prod | 4000 | 4096 |
输入数据结构
输入为包含多个应用的嵌套字典,每个应用结构一致:
test_data = { "appName": { "id": "123", "stages": { "dev": [{"request.cpu": 1000}, {"request.memory": 1024}], "staging": [{"request.cpu": 3200}, {"request.memory": 1024}] } }, "appName2": { "id": "456", "stages": { "dev": [{"request.cpu": 2000}, {"request.memory": 2048}], "prod": [{"request.cpu": 4000}, {"request.memory": 4096}] } } }
问题分析
原代码无法拆分stages下的资源列表,且将stages的键转为列,不符合目标格式。核心问题是需要扁平化嵌套结构,将每个stage的信息拆分为单独行。
实现代码
import pandas as pd test_data = { "appName": { "id": "123", "stages": { "dev": [{"request.cpu": 1000}, {"request.memory": 1024}], "staging": [{"request.cpu": 3200}, {"request.memory": 1024}] } }, "appName2": { "id": "456", "stages": { "dev": [{"request.cpu": 2000}, {"request.memory": 2048}], "prod": [{"request.cpu": 4000}, {"request.memory": 4096}] } } } # 初始化空列表存储扁平化后的数据 flat_records = [] # 遍历每个应用 for app_name, app_details in test_data.items(): app_id = app_details["id"] # 遍历应用下的每个stage for stage_name, resource_list in app_details["stages"].items(): # 合并资源列表中的两个字典,便于提取值 resource_dict = {} for item in resource_list: resource_dict.update(item) # 组装成目标格式的单行数据 flat_row = { "App": app_name, "id": app_id, "stages": stage_name, "requestCpu": resource_dict["request.cpu"], "requestMemory": resource_dict["request.memory"] } flat_records.append(flat_row) # 转换为DataFrame result_df = pd.DataFrame(flat_records) print(result_df) # 保存为CSV(可选) # result_df.to_csv("app_resource_config.csv", index=False)
代码说明
- 遍历应用:逐个取出应用名称和对应的基础信息(id、stages)
- 遍历Stage:对每个应用下的每个stage,拆分出stage名称和资源列表
- 合并资源字典:将资源列表中的两个小字典合并,统一获取
request.cpu和request.memory的值 - 组装扁平数据:将每个stage的信息整理成目标格式的字典,加入到列表中
- 生成DataFrame:用扁平化后的列表直接生成符合要求的DataFrame,也可直接导出为CSV
运行代码后,输出的DataFrame完全匹配目标格式。
内容的提问来源于stack exchange,提问作者N1ckson
相关产品推荐
相关产品推荐

