如何将含嵌套JSON字符串的字典转换为指定结构的DataFrame?
解决JSON字符串嵌套字典转结构化DataFrame问题
给定如下字典,其中meta字段是存储KPI信息的JSON字符串:
user_data = { 'id': 206, 'username': 'hantran', 'meta': '{"kpi_info":{"2021":{"1":{"revenue":"2000", "kpi":"2100","result":"0"}, "2":{"revenue":"2500", "kpi":"2000", "result":"1"}},"2022":{"1":{"revenue":"3000", "kpi":"2500","result":"1"}, "2":{"revenue":"2500", "kpi":"3000", "result":"0"}}}}' }
目标是转换成包含id、username、Year、Month、revenue、kpi、result字段的结构化DataFrame,具体结构如下:
| id | username | Year | Month | revenue | kpi | result |
|---|---|---|---|---|---|---|
| 206 | hantran | 2021 | 1 | 2000 | 2100 | 0 |
| 206 | hantran | 2021 | 2 | 2500 | 2000 | 1 |
| 206 | hantran | 2022 | 1 | 3000 | 2500 | 1 |
| 206 | hantran | 2022 | 2 | 2500 | 3000 | 0 |
解决步骤
- 解析JSON字符串:先用
json.loads把meta字段的JSON字符串转换成Python字典,方便后续遍历。 - 扁平化嵌套数据:遍历年份、月份层级,把每个月的KPI数据和顶层的
id、username拼接成扁平字典,收集到列表中。 - 生成DataFrame:用pandas把收集到的扁平列表转换成DataFrame,调整列顺序匹配目标结构。
完整代码
import json import pandas as pd # 原始数据 user_data = { 'id': 206, 'username': 'hantran', 'meta': '{"kpi_info":{"2021":{"1":{"revenue":"2000", "kpi":"2100","result":"0"}, "2":{"revenue":"2500", "kpi":"2000", "result":"1"}},"2022":{"1":{"revenue":"3000", "kpi":"2500","result":"1"}, "2":{"revenue":"2500", "kpi":"3000", "result":"0"}}}}' } # 解析meta字段的JSON字符串 meta_dict = json.loads(user_data['meta']) kpi_info = meta_dict['kpi_info'] # 构造扁平数据列表 flat_data = [] for year, months in kpi_info.items(): for month, kpi_data in months.items(): flat_item = { 'id': user_data['id'], 'username': user_data['username'], 'Year': year, 'Month': month, **kpi_data # 展开KPI字段 } flat_data.append(flat_item) # 生成DataFrame并调整列顺序 df = pd.DataFrame(flat_data) df = df[['id', 'username', 'Year', 'Month', 'revenue', 'kpi', 'result']] # 可选:将数值字段转为整数类型 df[['revenue', 'kpi', 'result']] = df[['revenue', 'kpi', 'result']].astype(int) # 查看结果 print(df)
运行代码后就能得到目标结构的DataFrame,数值字段的类型转换可根据需求选择是否执行。
内容的提问来源于stack exchange,提问作者Phạm Tấn Thành
相关产品推荐
相关产品推荐

