Python如何展开无键嵌套JSON数组并生成目标结构Pandas DataFrame
Pandas展开动态键嵌套JSON的实现方法
问题原因
之前的pd.json_normalize调用报错找不到id键,核心问题是数据结构存在动态生成的键:
availability是唯一固定的顶层键- 其下的日期(如
2022-07-15、2022-07-17)是动态键,没有固定字段名,无法直接通过record_path、meta参数指定固定读取路径 id和quantity字段实际存储在每个日期键对应的数组元素中,和日期键本身不在同一层级
实现代码
直接遍历动态键拼接记录是最简便、兼容性最好的方案,不需要依赖固定字段名:
import pandas as pd # 原始JSON数据 raw_data = {'availability': {'2022-07-15': [{'id': '1234', 'quantity': 14}, {'id': '5678', 'quantity': 18}, {'id': '2345', 'quantity': 20}], '2022-07-17': [{'id': '1234', 'quantity': 2}, {'id': '5678', 'quantity': 74}, {'id': '2345', 'quantity': 64}]} } record_list = [] # 遍历所有动态日期键,及对应日期下的库存条目 for date, stock_items in raw_data['availability'].items(): for item in stock_items: # 给每条库存条目绑定对应的日期 item['date'] = date record_list.append(item) # 生成DataFrame并将日期设为索引,和预期结构完全匹配 df = pd.DataFrame(record_list).set_index('date')
运行结果
执行后打印df即可得到目标结构:
id quantity date 2022-07-15 1234 14 2022-07-15 5678 18 2022-07-15 2345 20 2022-07-17 1234 2 2022-07-17 5678 74 2022-07-17 2345 64
该方案对动态键的适配性很强,后续
availability下新增任意日期的库存数据,都不需要修改处理逻辑。如果偏好json_normalize的链式写法,也可以先通过列表推导式把日期字段嵌入每个子项,再调用归一化接口,实现逻辑和遍历方案本质一致。
内容的提问来源于stack exchange,提问作者Masterclown
相关产品推荐
相关产品推荐

