You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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格式:

KeyValueDIdOtherField
Temperature25.5D001test
Humidity60D001test
Temperature28.0D002demo
Pressure1013D002demo

方式二:将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  # 移除列名的层级标识

生成的宽表格式:

DIdHumidityPressureTemperature
D00160NaN25.5
D002NaN101328.0

4. 适配不同JSON结构的注意点

  • 如果DId在更深的嵌套层级(比如data.info.DId),需在meta中写完整路径,例:meta=["data.info.DId"]。
  • 多层嵌套场景可通过sep参数指定字段分隔符,比如sep="_",会将嵌套字段转为parent_child格式。

内容的提问来源于stack exchange,提问作者peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:15:32