如何将特定结构的JSON文件转换为Pandas DataFrame
将嵌套JSON转换为指定结构的Pandas DataFrame
问题描述
现有如下结构的JSON数据:
[ { "name": "myName", "type": { "x": { "id": [ "x1", "x2" ] }, "y": { "id": "y1" }, "z": { "id": "z1" } } } ]
该JSON的规则为:
type的键仅可取x、y、z,可缺失部分但至少存在一个;- 每个类型对应的
id可以是单个值或列表,数量不超过10个。
需要将其转换为如下结构的Pandas DataFrame:
| Name | type | id |
|---|---|---|
| myName | x | x1 |
| myName | x | x2 |
| myName | y | y1 |
| myName | z | z1 |
尝试过to_json(orient="...")和json_normalize()方法,但无法展平JSON中的列表结构。
解决方法
可以通过遍历JSON数据,手动构造符合要求的字典列表,再转换为DataFrame,这种方式能灵活处理id是单个值或列表的情况:
import pandas as pd # 加载JSON数据(此处直接用示例数据,实际可通过pd.read_json或json.load读取文件) data = [ { "name": "myName", "type": { "x": { "id": ["x1", "x2"] }, "y": { "id": "y1" }, "z": { "id": "z1" } } } ] # 初始化结果列表 result_records = [] # 遍历顶层数据对象 for entry in data: current_name = entry["name"] # 遍历type下的每个类型键值对 for type_label, type_content in entry["type"].items(): # 统一处理id:单个值转为列表,保持逻辑一致 id_values = type_content["id"] if not isinstance(id_values, list): id_values = [id_values] # 每个id生成一条记录 for id_val in id_values: result_records.append({ "Name": current_name, "type": type_label, "id": id_val }) # 转换为目标DataFrame target_df = pd.DataFrame(result_records) print(target_df)
代码逻辑说明
- 遍历原始JSON的顶层对象,提取
name字段; - 遍历
type下的每个类型键(x/y/z),取出对应的id值; - 将单个
id值转为列表,统一后续循环处理的逻辑; - 每个
id对应生成一条包含Name、type、id的字典,添加到结果列表; - 用结果列表直接生成目标结构的DataFrame。
内容的提问来源于stack exchange,提问作者Matthijs
相关产品推荐
相关产品推荐

