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

如何在Pandas中将多层嵌套JSON转换为扁平化DataFrame?

多层嵌套JSON转扁平化DataFrame

你有一个多层嵌套的JSON结构,每个节点包含name和可选的children子节点,示例结构如下:

{
    'name': 'A text',
    'children': [
        {
            'name': 'A01 text',
            'children': [
                {
                    'name': 'A01A text',
                    'children': [
                        {
                            'name': 'A01AA text',
                            'children': [
                                {'name': 'A01AA01 text', 'children': [{'name': 'D00943  text'}]},
                                {'name': 'A01AA02 text', 'children': [{'name': 'D05864  text'}]},
                                {'name': 'A01AA03 text', 'children': [{'name': 'D05241  text'}]},
                                {'name': 'A01AA04 text', 'children': [{'name': 'D05919  text'}]},
                                {'name': 'A01AA30 text'},
                                {'name': 'A01AA51 text', 'children': [{'name': 'D08736  text'}]}
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

你尝试用pd.json_normalize()处理后未达到预期,希望得到如下结构的扁平化DataFrame:

level_1  level_2   level_3    level_4     level_5         level_6
A text   A01 text  A01A text  A01AA text  A01AA01 text  D00943  text
A text   A01 text  A01A text  A01AA text  A01AA02 text  D05864  text
A text   A01 text  A01A text  A01AA text  A01AA03 text  D05241  text
A text   A01 text  A01A text  A01AA text  A01AA04 text  D05919  text
A text   A01 text  A01A text  A01AA text  A01AA30 text  NaN
A text   A01 text  A01A text  A01AA text  A01AA51 text  D08736  text

解决方案

json_normalize默认无法处理这种需要保留完整层级路径的深度嵌套场景,我们可以用递归遍历的方式收集所有叶子节点的完整路径,再转换为DataFrame:

步骤1:编写递归函数收集路径

import pandas as pd

def collect_paths(node, current_path=None):
    if current_path is None:
        current_path = []
    # 将当前节点名称加入路径
    current_path = current_path + [node['name']]
    # 无自节点时,返回当前完整路径
    if 'children' not in node or not node['children']:
        return [current_path]
    # 遍历子节点,递归收集路径
    paths = []
    for child in node['children']:
        paths.extend(collect_paths(child, current_path))
    return paths

步骤2:处理JSON数据生成DataFrame

# 假设你的JSON数据存储在变量data中
all_paths = collect_paths(data)
# 转换为DataFrame,自动为缺失层级填充NaN
df = pd.DataFrame(all_paths)
# 为列统一命名为level_1、level_2...
df.columns = [f'level_{i+1}' for i in range(df.shape[1])]

运行后即可得到你期望的扁平化DataFrame结构。

原理说明

递归函数会逐层遍历每个节点,把当前节点名称加入路径;遇到没有子节点的叶子节点时,保存完整路径。最后将所有路径整理为DataFrame,缺失的层级自动填充NaN,再给列名统一命名为层级格式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:05:21