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

使用pandas.json_normalize处理嵌套JSON生成DataFrame时,第三层级字段访问失败的问题求助

解决嵌套JSON转Pandas DataFrame的层级访问问题

作为Python和Pandas新手,你遇到的这个问题其实很常见——嵌套JSON里混合了两种结构,直接用json_normalize没法一次性展开所有需要的实体数据。我来一步步帮你搞定:

首先,先拆解你的JSON结构:results数组里有两种元素:一种是带name和docs数组的对象(里面的docs才是实际的实体列表),另一种是直接包含id、label等字段的实体对象。这就是你用docs.id访问失败的核心原因——json_normalize把docs处理成了一列包含列表的字段,而不是展开成多行的嵌套字段。

最简单直观的解决方案(适合新手理解)

我们先手动把所有实体数据收集到一个统一的列表里,再转成DataFrame,逻辑清晰不容易出错:

import pandas as pd
import requests

# 先获取并解析JSON数据
result = requests.get(search_url)
data = result.json()

# 初始化一个空列表,用来装所有实体项
all_entities = []

# 遍历results里的每一项
for item in data["results"]:
    # 如果当前项里有docs字段,就把docs里的所有实体批量加进列表
    if "docs" in item:
        all_entities.extend(item["docs"])
    # 否则,当前项本身就是实体,直接加进去
    else:
        all_entities.append(item)

# 用统一的实体列表生成DataFrame,只保留你需要的字段
df = pd.DataFrame(all_entities)[["id", "label", "title"]]
# 查看最终结果
print(df)

这样处理后,你就能得到想要的表格:

idlabeltitle
RAKDI342342exampellabeltesttitle and titletest
GUI6N5QH...more label als exampletest the second title

用json_normalize的进阶写法

如果你想试试用Pandas原生工具来处理,可以分开处理两种结构再合并:

# 处理带docs的项,用record_path指定要展开的docs数组
docs_part = pd.json_normalize(data["results"], record_path="docs", errors="ignore")
# 处理不带docs的实体项,先筛选出来再转成DataFrame
non_docs_part = pd.json_normalize([item for item in data["results"] if "docs" not in item])
# 合并两个DataFrame,重置索引
final_df = pd.concat([docs_part, non_docs_part], ignore_index=True)[["id", "label", "title"]]

这种方法更贴合Pandas的特性,但手动遍历的方式逻辑更直白,新手更容易理解和调试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:02:52