如何在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
相关产品推荐
相关产品推荐

