Python中使用Pandas将嵌套JSON转换为指定结构DataFrame
嵌套JSON转目标DataFrame实现方案
核心思路是先提取需要关联的基础字段(id、Simple Fields下的所有字段),再将Linhas数组拆分为多行,最后把Linhas中的字典结构展开为单独列,实现每行对应一条Linhas明细并关联所有基础字段。
单条API响应处理示例
假设API返回的嵌套JSON结构如下:
import pandas as pd import json # 模拟API返回数据 api_response = { "id": "123", "resultJson": { "Simple Fields": { "NumFatura": "FAT-001", "Data": "2024-05-20", "Cliente": "ABC Corp" }, "Linhas": [ {"Produto": "Item A", "Quantidade": 2, "Preco": 10.5}, {"Produto": "Item B", "Quantidade": 1, "Preco": 25.0}, {"Produto": "Item C", "Quantidade": 5, "Preco": 3.2} ] } }
处理步骤:
- 合并id与Simple Fields字段,保留Linhas数组
base_data = { "id": api_response["id"], **api_response["resultJson"]["Simple Fields"] } base_data["Linhas"] = api_response["resultJson"]["Linhas"]
- 转换为DataFrame并拆分Linhas为多行
df = pd.DataFrame([base_data]) df_exploded = df.explode("Linhas", ignore_index=True)
- 展开Linhas中的字典为独立列,合并到原DataFrame
df_final = pd.concat( [df_exploded.drop("Linhas", axis=1), df_exploded["Linhas"].apply(pd.Series)], axis=1 )
最终df_final的结构就是每行对应一条Linhas明细,同时关联id、NumFatura、Data等所有基础字段。
多条API响应批量处理示例
如果返回的是多条数据的列表,可通过循环批量处理:
# 模拟多条API返回数据 api_responses = [ { "id": "123", "resultJson": { "Simple Fields": {"NumFatura": "FAT-001", "Data": "2024-05-20", "Cliente": "ABC Corp"}, "Linhas": [{"Produto": "Item A", "Quantidade": 2, "Preco": 10.5}, {"Produto": "Item B", "Quantidade": 1, "Preco": 25.0}] } }, { "id": "456", "resultJson": { "Simple Fields": {"NumFatura": "FAT-002", "Data": "2024-05-21", "Cliente": "XYZ Ltd"}, "Linhas": [{"Produto": "Item C", "Quantidade": 3, "Preco": 5.0}, {"Produto": "Item D", "Quantidade": 4, "Preco": 8.0}] } } ] # 批量预处理每条数据 processed_list = [] for resp in api_responses: item = {"id": resp["id"], **resp["resultJson"]["Simple Fields"]} item["Linhas"] = resp["resultJson"]["Linhas"] processed_list.append(item) # 转换并拆分 df = pd.DataFrame(processed_list) df_exploded = df.explode("Linhas", ignore_index=True) df_final = pd.concat([df_exploded.drop("Linhas", axis=1), df_exploded["Linhas"].apply(pd.Series)], axis=1)
注意事项
- 如果Simple Fields中的字段名包含空格或特殊字符,可通过
df.rename(columns={"原字段名": "新字段名"}, inplace=True)修改列名 - 若Linhas中存在缺失字段,
apply(pd.Series)会自动填充NaN,可根据需求用fillna()处理缺失值
内容的提问来源于stack exchange,提问作者ecworker
相关产品推荐
相关产品推荐

