You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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:经济数据

国家名称经济类型经济占比
JapanBusiness25%
JapanJobs50%
JapanGovernment25%
ChinaBusiness35%
ChinaJobs30%
ChinaGovernment35%

表格2:人口数据

国家名称人口统计类型数值
Japantest120L
Japantest215L
Chinatest130L

已尝试的方法

尝试过使用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错误,或得到包含嵌套数据的表格(如下),未达到期望格式:

namepopulation...economy.governmenttotal
0japan[{'test1': '20L', 'test2': '15L'}]...25%28
1china[{'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格式。

失败原因说明

  1. 原始代码错误地将根节点字典当作列表处理(d[0]),触发KeyError: 0;
  2. json_normalize默认会将嵌套结构展平为列(如economy.government),无法直接生成需要的长格式表格,需额外做行转换处理。

内容的提问来源于stack exchange,提问作者Brookie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:35:21