pandas如何提取深度嵌套JSON中指定路径的intervals到DataFrame
嵌套重名键JSON转DataFrame实现方案
核心解决思路
pd.json_normalize原生支持多层级路径定位,不需要手动拆分列绕路,直接通过路径列表精准定位meter_intervals下的目标intervals数组,完全避开根层级同名键的匹配问题。
可直接运行的代码
import pandas as pd import json # 替换为你的实际数据加载逻辑 # data = json.load(open("your_file.json", "r")) # 以下为适配你提供结构的示例数据 data = { "system_id": 3212644, "total_devices": 1, "intervals": [ {"end_at": 1656504900, "devices_reporting": 1, "wh_del": 0}, {"end_at": 1656505800, "devices_reporting": 1, "wh_del": 0} ], "meta": {"status": "normal", "last_report_at": 1656588634, "last_energy_at": 1656588600, "operational_at": 1655953200}, "meter_intervals": [ { "meter_serial_number": "122147019814EIM1", "envoy_serial_number": "122147019814", "intervals": [ {"channel": 1, "wh_del": 0.0, "curr_w": -2, "end_at": 1656504900}, {"channel": 1, "wh_del": 0.0, "curr_w": -3, "end_at": 1656505800} ] } ] } # 核心转换逻辑 df = pd.json_normalize( data, # 按层级传入路径列表,精准定位目标数组,不会匹配根层级的intervals record_path=["meter_intervals", "intervals"], # 可选:需要关联上层电表信息、根层级系统信息时配置meta即可 meta=[ ["meter_intervals", "meter_serial_number"], ["meter_intervals", "envoy_serial_number"], "system_id", "total_devices" ], # 可选:给元数据列加前缀,避免和记录内字段重名 meta_prefix="info_" )
运行后输出的DataFrame会直接展开所有间隔字段:channel/wh_del/curr_w/end_at,同时携带关联的电表序列号、系统ID等信息,无嵌套残留。
如果不需要关联上层元数据,核心代码可以简化为一行:
df = pd.json_normalize(data, record_path=["meter_intervals", "intervals"])
原有方案问题说明
- 传入
record_path='intervals'时,pandas默认从根层级开始匹配第一个同名键,自然只能拿到根层级的汇总间隔数据,无法定位深层字段。 - 不传
record_path直接调用pd.json_normalize(data)时,只会扁平化根层级的非数组字段,数组类型的meter_intervals会整体作为单列存储,不会自动递归展开多层数组。 - 手动提取
df['meter_intervals']做二次处理属于冗余操作,通过原生参数指定路径是pandas官方支持的标准写法,代码更简洁,执行效率也更高。
内容的提问来源于stack exchange,提问作者BenniBenassi
相关产品推荐
相关产品推荐

