如何将嵌套JSON完整解析为Pandas DataFrame?
问题描述
背景
我尝试从一个返回大型嵌套JSON数据的API获取数据,希望将其转换为更易读的格式,该API的JSON结构可查看对应的接口文档(点击右侧展开全部)。
已尝试方案
我查阅了Stack Overflow等网站,得知pd.json_normalize是可行方案,但多次尝试后仅能解析一层:
# 尝试1 url = 'https://api.opennem.org.au/station/' response = requests.get(url).json() df2 = pd.json_normalize(response, max_level=0) print(df2) # 尝试2 url = 'https://api.opennem.org.au/station/' response = requests.get(url).json() df = pd.json_normalize(response, record_path=['facilities']) print(df)
当前错误输出
version ... data 0 3.11.3 ... [{'id': 488, 'code': 'ADP', 'name': 'Adelaide ... [1 rows x 5 columns]
请求帮助
请问如何将这个大型嵌套JSON完整解析为DataFrame?
解决方案
这个API返回的结构外层包含data字段,内部才是嵌套的站点列表,所以需要指定record_path指向data,同时用meta保留外层元数据,让json_normalize自动递归解析嵌套内容。
基础解析代码
import requests import pandas as pd url = 'https://api.opennem.org.au/station/' response = requests.get(url).json() # 展开data数组,保留外层元数据,用下划线连接嵌套字段 df = pd.json_normalize( response, record_path='data', meta=['version', 'revision', 'updated_at'], sep='_' ) print(df.head())
深层嵌套字段展开
如果需要进一步展开站点下的facilities等嵌套数组,可以单独处理:
# 展开每个站点的facilities字段,保留站点基础信息 df_facilities = pd.json_normalize( response['data'], record_path='facilities', meta=['id', 'code', 'name'], sep='_' ) print(df_facilities.head())
关键参数说明
record_path:指定JSON中要展开为DataFrame行的数组字段,这里外层data是核心数据数组。meta:保留外层非数组字段,作为结果的附加列。sep:定义嵌套字段的连接符,避免列名出现.引发后续操作问题。- 默认情况下
json_normalize会递归解析所有嵌套层级,无需额外设置max_level(除非要限制展开深度)。
内容的提问来源于stack exchange,提问作者Bobby Heyer
相关产品推荐
相关产品推荐

