如何用pandas.json_normalize将嵌套JSON标准化为目标DataFrame?
解决嵌套JSON转换问题:保留DId并展开Values列
1. 先明确待处理JSON结构示例
假设你的JSON结构类似这种(如果实际结构不同,可对应调整参数):
sample_json = [ { "DId": "D001", "OtherField": "test", "Values": [ {"Key": "Temperature", "Value": 25.5}, {"Key": "Humidity", "Value": 60} ] }, { "DId": "D002", "OtherField": "demo", "Values": [ {"Key": "Temperature", "Value": 28.0}, {"Key": "Pressure", "Value": 1013} ] } ]
2. 问题根源
- 缺失
DId:使用json_normalize展开嵌套数组时,默认不会自动携带上层字段,需手动指定要保留的元数据字段。 Values仍为字典列表:未指定record_path指向Values数组,导致嵌套结构未被展开。
3. 正确代码实现
方式一:将Values拆分为多行,保留对应DId
适合需要把每个Values条目作为单独行的场景:
import pandas as pd df = pd.json_normalize( sample_json, record_path="Values", # 指定要展开的嵌套数组路径 meta=["DId", "OtherField"] # 指定要保留的上层字段 )
生成的DataFrame格式:
| Key | Value | DId | OtherField |
|---|---|---|---|
| Temperature | 25.5 | D001 | test |
| Humidity | 60 | D001 | test |
| Temperature | 28.0 | D002 | demo |
| Pressure | 1013 | D002 | demo |
方式二:将Values的Key转为列(宽表格式)
适合需要把不同Key作为列的场景:
# 先转成行格式,再通过pivot转宽表 df_long = pd.json_normalize(sample_json, record_path="Values", meta=["DId"]) df_wide = df_long.pivot(index="DId", columns="Key", values="Value").reset_index() df_wide.columns.name = None # 移除列名的层级标识
生成的宽表格式:
| DId | Humidity | Pressure | Temperature |
|---|---|---|---|
| D001 | 60 | NaN | 25.5 |
| D002 | NaN | 1013 | 28.0 |
4. 适配不同JSON结构的注意点
- 如果
DId在更深的嵌套层级(比如data.info.DId),需在meta中写完整路径,例:meta=["data.info.DId"]。 - 多层嵌套场景可通过
sep参数指定字段分隔符,比如sep="_",会将嵌套字段转为parent_child格式。
内容的提问来源于stack exchange,提问作者peter
相关产品推荐
相关产品推荐

