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

如何将含多列的嵌套JSON字典解析为Pandas DataFrame?

嘿,我完全懂这种被嵌套JSON搞疯的感觉——尤其是当它堆了一大堆列的时候!我之前也踩过一模一样的坑,给你分享几个亲测有效的方法,应该能帮你把乱糟糟的嵌套数据拆成清晰可看的Pandas DataFrame列。

方法1:用pd.json_normalize()深度解析

这绝对是处理嵌套JSON的首选工具,Pandas专门为这个场景做了优化,比自己写循环靠谱多了。

如果你的API响应是包含字典的列表(这是最常见的API返回格式),直接用下面的代码就行:

import pandas as pd

# 假设你的API响应存在response变量里
df = pd.json_normalize(response)

要是嵌套层级特别深,还可以用sep参数指定层级分隔符,比如用下划线把父键和子键连起来,避免列名混乱:

df = pd.json_normalize(response, sep='_')

如果JSON里还有嵌套的数组字段(比如某个键对应一个列表),可以用record_path指定要展开的数组,再用meta保留外层的关键字段:

# 比如response里的'orders'是嵌套数组,同时保留外层的'user_id'和'user_name'
df = pd.json_normalize(
    response,
    record_path='orders',
    meta=['user_id', 'user_name']
)
方法2:手动递归拆解极端复杂的嵌套

要是遇到那种字典套数组再套字典的变态结构,json_normalize可能会有点吃力,这时候可以写个简单的递归函数来扁平化每个条目:

def flatten_json(nested_json, exclude=['']):
    out = {}
    def flatten(x, name=''):
        # 处理字典类型
        if isinstance(x, dict):
            for key in x:
                if key not in exclude:
                    flatten(x[key], name + key + '_')
        # 处理列表类型
        elif isinstance(x, list):
            for idx, item in enumerate(x):
                flatten(item, name + str(idx) + '_')
        # 处理基础数据类型(字符串、数字等)
        else:
            out[name[:-1]] = x
    flatten(nested_json)
    return out

# 把每个响应条目都扁平化,再转成DataFrame
flattened_data = [flatten_json(item) for item in response]
df = pd.DataFrame(flattened_data)

这个函数会把所有嵌套层级都展开,用下划线连接,列表里的元素会带上索引前缀,比如列表第一个元素的键会变成0_xxx,方便你区分。

方法3:先搞清楚JSON的真实结构

很多时候卡壳是因为我们没摸透JSON的层级,先打印格式化后的响应看看:

import json

# 把响应转成带缩进的字符串,一目了然
print(json.dumps(response, indent=4))

看完结构你就知道哪些是要展开的数组,哪些是外层的元数据,再针对性用上面的方法处理就轻松多了。

几个常见小坑提醒

  • 如果API响应是一个大字典,里面的data或者results字段才是你要的列表,记得先提取:df = pd.json_normalize(response['data'])
  • 遇到空值也不用慌,Pandas会自动把它们转成NaN,后续可以用df.fillna()处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:49:55