如何用Python Pandas将多层嵌套JSON转换为指定格式表格?
用Python Pandas将多层嵌套JSON转换为指定格式表格
原始JSON数据
{ "continent": "Asia", "countries": [ { "total" : "28", "country": [ { "name": "japan", "economy": { "business": "25%", "jobs": "50%", "government": "25%" }, "population": [ { "test1": "20L", "test2": "15L" } ] }, { "name": "china", "economy": { "business": "35%", "jobs": "30%", "government": "35%" }, "population": [ { "test1": "30L" } ] } ] } ] }
期望输出
表格1:经济数据
| 国家名称 | 经济类型 | 经济占比 |
|---|---|---|
| Japan | Business | 25% |
| Japan | Jobs | 50% |
| Japan | Government | 25% |
| China | Business | 35% |
| China | Jobs | 30% |
| China | Government | 35% |
表格2:人口数据
| 国家名称 | 人口统计类型 | 数值 |
|---|---|---|
| Japan | test1 | 20L |
| Japan | test2 | 15L |
| China | test1 | 30L |
已尝试的方法
尝试过使用pandas的json_normalize、flat_json,并编写了以下代码:
import json import pandas as pd with open('test.json') as f: d = json.load(f) dataFrame = pd.DataFrame(columns=d[0].keys()) for i in range(len(d)): dataFrame.loc[i] = d[i].values() print(dataFrame)
但运行时出现KeyError: 0错误,或得到包含嵌套数据的表格(如下),未达到期望格式:
| name | population | ... | economy.government | total | |
|---|---|---|---|---|---|
| 0 | japan | [{'test1': '20L', 'test2': '15L'}] | ... | 25% | 28 |
| 1 | china | [{'test1': '30L'}] | ... | 35% | 28 |
正确实现方法
要生成指定格式的两个表格,需要分别提取经济和人口数据,再将嵌套的字典转换为长格式行数据,步骤如下:
步骤1:加载并提取核心数据
先读取JSON文件,提取出需要处理的国家列表:
import json import pandas as pd # 加载JSON数据 with open('test.json') as f: data = json.load(f) # 提取countries下的country列表 country_list = data['countries'][0]['country']
步骤2:生成经济数据表格
遍历每个国家,将economy字典拆分为(经济类型、占比)的键值对,再与国家名称组合成DataFrame:
# 收集经济数据行 economy_rows = [] for country in country_list: country_name = country['name'].capitalize() # 遍历economy的键值对 for eco_type, ratio in country['economy'].items(): economy_rows.append({ '国家名称': country_name, '经济类型': eco_type.capitalize(), '经济占比': ratio }) # 转换为DataFrame df_economy = pd.DataFrame(economy_rows) print(df_economy)
运行后得到的df_economy即为期望的表格1格式。
步骤3:生成人口数据表格
同理处理population数据(注意每个国家的population是包含单个字典的列表):
# 收集人口数据行 population_rows = [] for country in country_list: country_name = country['name'].capitalize() # 提取population中的字典 pop_data = country['population'][0] for stat_type, value in pop_data.items(): population_rows.append({ '国家名称': country_name, '人口统计类型': stat_type, '数值': value }) # 转换为DataFrame df_population = pd.DataFrame(population_rows) print(df_population)
运行后得到的df_population即为期望的表格2格式。
失败原因说明
- 原始代码错误地将根节点字典当作列表处理(
d[0]),触发KeyError: 0; json_normalize默认会将嵌套结构展平为列(如economy.government),无法直接生成需要的长格式表格,需额外做行转换处理。
内容的提问来源于stack exchange,提问作者Brookie
相关产品推荐
相关产品推荐

