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

Pandas json_normalize兼容嵌套对象空值与非空值的实现方法

问题根源

pd.json_normalize在指定record_path参数时,默认会丢弃record_path对应字段为空列表的记录的所有元字段,不会保留对应行,这就是空列表场景下返回空DataFrame的直接原因。

兼容两种场景的实现方案

两种方案都不需要复杂的遍历判断,可直接兼容addressIdentifications为空、单条记录、多条记录的所有情况。

方案1:预处理空列表填充占位值

直接在归一化前给空的addressIdentifications列表填充空字典占位,保证每条记录至少有一条展开项,不修改原有归一化逻辑:

# 预处理原始数据
processed = []
for row in data:
    current = row.copy()
    # 空列表填充空字典占位
    if not current["addressIdentifications"]:
        current["addressIdentifications"] = [{}]
    processed.append(current)

# 原有归一化逻辑无需修改
df_out = pd.json_normalize(
    processed,
    meta=["address", "risk", ["cluster", "name"], ["cluster", "category"]],
    record_path="addressIdentifications",
    record_prefix="addressIdentification_"
)

处理后,原空列表记录的address、risk、cluster字段会完整保留,展开的地址标识相关字段为NaN,和非空记录的DataFrame结构完全对齐。

方案2:分块归一化后关联

如果不想修改原始数据,可分两次做归一化,再通过索引关联合并,天然兼容空值场景:

# 第一步:提取基础字段,自动展平cluster嵌套结构,丢弃待展开的列表字段
df_base = pd.json_normalize(data).drop(columns=["addressIdentifications"])

# 第二步:单独展开addressIdentifications列表,自动携带原始行索引
df_ident = pd.json_normalize(
    data,
    record_path="addressIdentifications",
    record_prefix="addressIdentification_"
)

# 左连接合并,所有原始记录都会保留,空列表的展开字段自动填充NaN
df_out = df_base.join(df_ident)

该方案不需要手动判断字段是否为空,执行效率更高,展平后的cluster字段默认列名为cluster.name、cluster.category,如果需要调整列名可通过df_out.rename()方法修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:54:36