如何从嵌套JSON提取数据并存储到Pandas DataFrame?
如何从嵌套JSON分类树提取数据到Pandas DataFrame?
嘿,这个需求很常见!要把这种嵌套的树形分类JSON转成Pandas DataFrame,核心就是遍历整个树形结构,把每个分类节点的信息连同它的父分类ID一起收集起来,这样就能得到一个扁平的、方便后续分析的表格。下面是具体的实现步骤:
步骤1:导入依赖库
首先确保你已经安装了pandas,然后导入需要的模块:
import pandas as pd import json
步骤2:加载JSON数据
如果你的JSON是字符串形式,用json.loads()解析;如果是本地文件,用json.load()读取。这里直接使用你提供的JSON示例:
# 你的嵌套JSON数据 json_data = { "SuccessResponse": { "Head": { "RequestAction": "GetCategoryTree", "RequestId": "", "ResponseType": "Categories", "Timestamp": "2018-05-19T00:30:55+08:00" }, "Body": [ { "categoryId": 1902, "children": [ { "categoryId": 10001930, "children": [ {"categoryId": 10001958,"children": [],"leaf": true,"name": "Accessories","var": false}, {"categoryId": 10001957,"children": [],"leaf": true,"name": "Backpacks","var": false}, {"categoryId": 10001956,"children": [],"leaf": true,"name": "Backpacks Trolley","var": false}, {"categoryId": 10001955,"children": [],"leaf": true,"name": "Bags","var": false} ], "leaf": false, "name": "Kids Bags", "var": false }, # 省略其他分类节点内容 ], "leaf": false, "name": "Bags & Luggage", "var": false } ] } } # 提取根分类节点(Body里的内容) root_categories = json_data['SuccessResponse']['Body']
步骤3:递归遍历树形结构
写一个递归函数,遍历每个分类节点,收集节点的核心信息,同时记录父分类ID(用来体现层级关系):
def collect_category_data(node, parent_id=None): # 存储所有分类数据的列表 data = [] for category in node: # 提取当前分类的关键字段 category_info = { 'categoryId': category['categoryId'], 'name': category['name'], 'leaf': category['leaf'], 'var': category['var'], 'parent_id': parent_id # 根分类的父ID设为None } data.append(category_info) # 如果当前分类有子节点,递归遍历子节点 if not category['leaf'] and category['children']: data.extend(collect_category_data(category['children'], parent_id=category['categoryId'])) return data # 调用函数收集所有分类数据 category_list = collect_category_data(root_categories)
步骤4:转换为Pandas DataFrame
把收集到的列表直接转换为DataFrame,还可以调整列的顺序让结构更清晰:
df = pd.DataFrame(category_list) # 调整列顺序,优先展示分类ID、名称、父ID df = df[['categoryId', 'name', 'parent_id', 'leaf', 'var']]
最终效果
转换后的DataFrame会像这样(片段示例):
| categoryId | name | parent_id | leaf | var |
|---|---|---|---|---|
| 1902 | Bags & Luggage | None | False | False |
| 10001930 | Kids Bags | 1902 | False | False |
| 10001958 | Accessories | 10001930 | True | False |
| 10001957 | Backpacks | 10001930 | True | False |
这样你就能清晰看到每个分类的层级关系,方便后续的筛选、统计或其他分析操作啦。
内容的提问来源于stack exchange,提问作者AnalyticsPy
相关产品推荐
相关产品推荐

