如何用Python的json_normalize一次性解析含两个数组的JSON?
单次用json_normalize解析含双数组的JSON数据
可以通过先预处理生成两个数组的笛卡尔积记录,再单次调用json_normalize完成解析,无需分两次再交叉连接。
示例JSON数据
{ "id": "0001", "type": "donut", "name": "Cake", "ppu": 0.55, "batters": { "batter": [ { "id": "1001", "type": "Regular" }, { "id": "1002", "type": "Chocolate" }, { "id": "1003", "type": "Blueberry" } ] }, "topping": [ { "id": "5001", "type": "None" }, { "id": "5002", "type": "Glazed" }, { "id": "5005", "type": "Sugar" } ] }
实现代码
import pandas as pd from itertools import product # 加载你的JSON数据(这里用示例数据) data = { "id": "0001", "type": "donut", "name": "Cake", "ppu": 0.55, "batters": { "batter": [ { "id": "1001", "type": "Regular" }, { "id": "1002", "type": "Chocolate" }, { "id": "1003", "type": "Blueberry" } ] }, "topping": [ { "id": "5001", "type": "None" }, { "id": "5002", "type": "Glazed" }, { "id": "5005", "type": "Sugar" } ] } # 生成batter和topping的笛卡尔积记录,同时保留原数据的其他字段 records = [ {**batter, **topping, **{k: v for k, v in data.items() if k not in ["batters", "topping"]}} for batter, topping in product(data["batters"]["batter"], data["topping"]) ] # 单次调用json_normalize解析 df = pd.json_normalize(records) print(df)
说明
- 用
itertools.product生成batters.batter和topping两个数组的笛卡尔积,得到所有可能的组合 - 把每个组合和原数据中不属于数组的字段(如
id、type、name等)合并成单个记录 - 最后用
pd.json_normalize解析这个记录数组,直接得到包含所有交叉组合的DataFrame
这种方式本质上是先做数据预处理,再单次调用json_normalize,避免了分两次解析再交叉连接的繁琐步骤。
内容的提问来源于stack exchange,提问作者Semyon-coder
相关产品推荐
相关产品推荐

