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

PySpark处理含嵌套结构与动态键的JSON并生成高表咨询

问题

需要处理IMF政府债务占GDP比例的JSON数据,将其转换为包含year、country、value列的长表(高表),且方案需支持动态适配新增年份数据。请问如何实现?是否有适用的内置函数,还是必须用循环?

实现方案(以Python + Pandas为例)

这个场景完全不需要写循环,用Pandas的内置函数就能搞定,而且天然支持动态适配新增年份:

1. 拉取并解析JSON数据

import requests
import pandas as pd

# 拉取数据并解析
resp = requests.get("https://www.imf.org/external/datamapper/api/v1/GG_DEBT_GDP")
raw_data = resp.json()

2. 提取核心数据结构

IMF的这个JSON结构固定:data.GG_DEBT_GDP下包含三个关键部分:

  • countries:国家代码与名称的映射
  • years:所有统计年份的列表
  • values:以国家代码为键、年份数据为值的字典

3. 转宽表再逆透视成长表

# 构建国家名称映射
country_names = {code: name for code, name in raw_data['data']['GG_DEBT_GDP']['countries'].items()}
# 提取年份列表和数值数据
years = raw_data['data']['GG_DEBT_GDP']['years']
country_values = raw_data['data']['GG_DEBT_GDP']['values']

# 把数值数据转成宽表(行=国家代码,列=年份)
wide_table = pd.DataFrame.from_dict(country_values, orient='index', columns=years)
# 添加国家名称列
wide_table['country'] = wide_table.index.map(country_names)

# 用melt做逆透视,自动把所有年份列转成year行
long_table = wide_table.melt(
    id_vars=['country'],
    var_name='year',
    value_name='value'
)

# 清理空值并格式化年份
long_table = long_table.dropna(subset=['value'])
long_table['year'] = long_table['year'].astype(int)

动态性说明

  • 代码直接从JSON中读取所有年份和国家,不管后续新增多少年份,只要JSON结构不变,pd.DataFrame.from_dict和melt会自动识别新增的年份列,无需修改代码。
  • 完全避免了循环,效率更高,也更易维护。

非代码方案(Excel Power Query)

如果不想写代码,用Excel内置的Power Query也能实现动态转换:

  • 菜单栏「数据」>「获取数据」>「从Web」,输入目标URL导入JSON;
  • 逐层展开data > GG_DEBT_GDP,分别提取countries、years、values;
  • 将values转换为表格,选中国家代码列,右键选择「逆透视其他列」;
  • 关联countries映射表,替换国家代码为名称,最终得到包含year、country、value的长表;
  • 后续只需点击「刷新数据」,就能自动加载新增年份的数据。

结论

  • 不需要循环,不管用Pandas的melt还是Excel Power Query的逆透视功能,都是专门处理宽表转长表的内置工具,既能简化实现,又能天然支持动态适配新增数据。
  • 核心思路是利用内置工具对数据结构的自动识别,避免手动遍历年份或国家,确保方案的扩展性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:05:24