如何将多层JSON高效转换为指定格式的Pandas DataFrame?
高效转换多层JSON到Pandas DataFrame的方案
直接用pd.json_normalize的参数组合就能搞定,不用写繁琐的循环。核心是正确指定record_path和meta参数,把需要重复的上层字段(顶级属性、单帧metadata)关联到每个detection条目上。
示例JSON结构(模拟你的3D相机数据)
sample_json = { "attribute1": "cam_001", "attribute2": "indoor", "data": [ { "metadata": {"timestamp": 1620000000, "frame_id": 1, "resolution": "1080p"}, "detections": [ {"dim1": 1.2, "dim2": 0.8, "class": "person"}, {"dim1": 0.9, "dim2": 1.1, "class": "box"} ] }, { "metadata": {"timestamp": 1620000001, "frame_id": 2}, "detections": [ {"dim1": 1.5, "dim2": 0.7, "class": "person"} ] } ] }
核心代码实现
import pandas as pd # 手动指定要提取的metadata字段(适合结构固定的场景) df = pd.json_normalize( sample_json, # 指定要展开为行的数组:data下的detections列表 record_path=['data', 'detections'], # 指定需要从上层嵌套中提取并重复的字段 meta=[ 'attribute1', # 顶级字段 'attribute2', # 顶级字段 ['data', 'metadata', 'timestamp'], # 单帧metadata字段 ['data', 'metadata', 'frame_id'], # 单帧metadata字段 ['data', 'metadata', 'resolution'] # 可选:如果部分帧缺失,errors='ignore'会自动填充NaN ], errors='ignore' # 忽略缺失字段的报错 ) # 可选:重命名列,去掉冗余的前缀 df.columns = df.columns.str.replace('data.metadata.', '') # 输出结果 print(df)
灵活适配任意metadata字段(自动遍历)
如果metadata的字段不确定或太多,不想手动罗列,可以自动提取所有metadata键:
# 假设所有帧的metadata结构一致,取第一帧的键生成meta字段列表 metadata_keys = sample_json['data'][0]['metadata'].keys() meta_fields = [['data', 'metadata', key] for key in metadata_keys] # 组合顶级字段和自动生成的metadata字段 full_meta = ['attribute1', 'attribute2'] + meta_fields df = pd.json_normalize( sample_json, record_path=['data', 'detections'], meta=full_meta, errors='ignore' ) # 重命名列 df.columns = df.columns.str.replace('data.metadata.', '')
结果说明
最终的DataFrame会把每个detection作为一行,对应的顶级属性(attribute1/attribute2)和该帧的metadata字段(timestamp/frame_id等)会自动重复填充,完全符合你的需求。
优势对比
相比手动循环,这种方法利用Pandas内部优化的向量化操作,处理大数据量时速度快很多,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者André Lourenço
相关产品推荐
相关产品推荐

