Python如何从API嵌套JSON提取指定字段生成Pandas DataFrame
嵌套JSON定向提取生成Pandas DataFrame实操方案
问题本质拆解
- 你之前使用全量
flatten方法不符合需求,核心原因是这类方法会把所有嵌套键值对无差别拆成平面对象,自然会带出大量冗余字段 - 你使用
json_normalize无法定位到目标events节点,是因为没有指定行数据的起始位置,默认从JSON最顶层开始逐层拆解,没法跳过前两层的无关结构 - 你提供的示例JSON存在语法问题:实际API返回结构中,leagues节点下重复的
events键一定是列表结构,否则JSON解析时会发生键值覆盖,无法保留多组赛事数据
方案1:手动定向层级遍历(新手零门槛适配)
这类方法完全绕开全量扁平化逻辑,只顺着目标字段的固定路径取值,完全可控不会带出冗余内容:
- 初始化空列表存储每行有效数据
- 逐层跳过无关中间节点,直接定位到第三层的events列表
- 遍历每个event元素,仅提取需要的字段值,自动跳过不需要的字段
import pandas as pd # 初始化存储行数据的列表 row_list = [] # 跳过schedule、leagues两层无关节点,直接定位到events列表 target_events = resp["schedule"]["leagues"]["events"] for event in target_events: # 提取event层需要的取值(兼容示例中a=A、e=E的两种情况) base_val = event.get("a", event.get("e")) # 定位到event下嵌套的markets层 market_info = event["markets"] # 提取markets层需要的取值,自动跳过c/g这类不需要的字段 mid_val = market_info.get("b", market_info.get("f")) end_val = market_info.get("d", market_info.get("h")) # 打包为单行数据存入列表 row_list.append({ "base_value": base_val, "mid_value": mid_val, "end_value": end_val }) # 直接生成仅含目标字段的DataFrame df = pd.DataFrame(row_list)
优势:逻辑完全透明,哪怕后续JSON结构有微调,只要调整路径取值的代码即可适配,不会出现全量扁平化后的字段错位问题
方案2:json_normalize 精准参数配置(无需手动循环)
你之前使用json_normalize没拿到有效结果,是因为没有用对核心参数,正确配置后可以直接跳过前两层节点,定向提取需要的字段:
关键参数说明:
record_path:传入数组形式的路径,直接指定每行数据的起点位置,这里直接定位到第三层的events节点,跳过前两层无关结构meta:指定需要拉取的字段路径(支持嵌套层路径),不需要的字段完全不传入,自然不会出现在最终结果中errors="ignore":避免部分节点缺字段时直接抛出报错
df = pd.json_normalize( data = resp, # 直接将行起点定位到第三层的events节点 record_path = ["schedule", "leagues", "events"], # 仅配置需要拉取的字段路径 meta = [ ["a"], ["e"], ["markets", "b"], ["markets", "f"], ["markets", "d"], ["markets", "h"] ], errors = "ignore" ) # 最后仅保留需要的列组合,删除所有冗余列 df = df[["a", "markets.b", "markets.d"]].rename( columns = { "a": "base_value", "markets.b": "mid_value", "markets.d": "end_value" } )
优势:不需要编写手动循环逻辑,路径配置完成后即可直接生成目标结构的DataFrame
核心注意事项
- 不需要强求全量扁平化:只要明确目标字段的完整路径,不管前面嵌套了多少层无关节点,直接顺着路径跳转取值即可
json_normalize支持任意深度的路径定位:不需要从JSON最顶层开始逐层拆解,只要传对record_path的路径数组,就可以把行起点设在任意深度的节点上- 丢弃冗余字段的逻辑非常简单:不管用哪种方法,只要最后在生成DataFrame时选取需要的列,就可以完全避免无关字段进入结果集,不需要在提取阶段就删除所有冗余内容
内容的提问来源于stack exchange,提问作者Minten
相关产品推荐
相关产品推荐

