当前位置: 首页 > news >正文

任意复杂度的 JSON 数据转换为多个结构化的 Pandas DataFrame 表格

以下是一个 完整、结构清晰、可运行的 Python 工具,用于将任意复杂度的 JSON 数据转换为多个结构化的 Pandas DataFrame 表格。该工具支持嵌套对象、嵌套数组,并通过主键和外键建立表之间的关联关系。

if __name__ == "__main__":# 示例 JSON 数据json_data = {"name": "Alice","age": 28,"address": {"city": "Chicago","zip": "60601"},"hobbies": [{"name": "Reading", "level": "Intermediate"},{"name": "Cooking", "level": "Advanced"}]}# 初始化转换器converter = JsonToTablesConverter()# 执行转换converter.flatten(json_data)# 获取生成的 DataFramedfs = converter.to_dataframes()# 打印结果for table_name, df in dfs.items():print(f"Table: {table_name}")print(df)print()
import pandas as pd
from collections import defaultdictclass JsonToTablesConverter:def __init__(self):self.tables = defaultdict(list)  # 存储所有表的记录self.id_counter = 0              # 主键生成器def generate_id(self):"""生成自增主键"""self.id_counter += 1return self.id_counterdef flatten(self, data, table_name="root", parent_id=None):"""递归处理 JSON 数据,生成结构化表:param data: JSON 数据(字典或列表):param table_name: 当前处理的表名:param parent_id: 父表主键(用于外键引用):return: 返回当前结构的主键 ID"""if isinstance(data, dict):# 当前表的主键current_id = self.generate_id()record = {f"{table_name}_id": current_id}# 如果有父表,添加外键if parent_id is not None:record["parent_id"] = parent_id# 遍历字典中的每个字段for key, value in data.items():if isinstance(value, dict):# 嵌套对象:递归处理,返回子表主键child_id = self.flatten(value, f"{table_name}_{key}", current_id)record[f"{key}_id"] = child_idelif isinstance(value, list):# 嵌套数组:递归处理每个元素for item in value:self.flatten(item, f"{table_name}_{key}", current_id)else:# 基本类型字段:直接作为当前表的列record[key] = value# 将当前记录添加到对应表中self.tables[table_name].append(record)return current_idelif isinstance(data, list):# 处理数组中的每个元素for item in data:self.flatten(item, table_name, parent_id)def to_dataframes(self):"""将收集的表数据转换为 Pandas DataFrame:return: 字典形式的 {表名: DataFrame}"""return {name: pd.DataFrame(records) for name, records in self.tables.items()}def reset(self):"""重置状态,用于多次转换"""self.tables.clear()self.id_counter = 0
http://www.xdnf.cn/news/455113.html

相关文章:

  • 吊舱夜视聚光灯模块设计的要点概述
  • vxe-table 同时实现合并单元格与任意列展开行
  • gmsh读取 STEP 文件并划分网格
  • eBPF 开源项目 Cilium 深入分析
  • Express项目解决跨域问题
  • 代码随想录 算法训练 Day1:数组
  • Vue 3 打开 el-dialog 时使 el-input 获取焦点
  • C#扩展方法的入门理解
  • 【证书与信任机制​】自签名证书的风险与适用场景​​
  • 白日梦:一个方便快捷的将故事制作成视频的工具
  • Codeforces Round 996 (Div. 2)
  • 【深入Spring系列】源码级深入剖析SpringBoot如何实现自动装载
  • 网络流量监控设备与质量监控
  • 基于IMX429-IMX430-IMX432-IMX437等sensor的SLVS桥MIPI透传模组方案
  • uniapp vue 沉浸式窗体如何获取并排除外部手机浏览器底部菜单栏工具栏高度
  • 第十九次博客打卡
  • 理解概率密度函数
  • LU分解求解线性方程组
  • 实验九视图索引
  • “AI+儿童陪伴”,是噱头还是趋势?
  • 数据结构学习之链表学习:单链表
  • Java—— 双列集合Map的实现类
  • Mq队列的了解与深入
  • FlashInfer - 介绍 LLM服务加速库 地基的一块石头
  • Unity3D游戏内存管理优化指南
  • 基于SIP协议的VOIP话机认证注册流程分析与抓包验证
  • 网络层简单习题
  • 第二章:磁盘管理与文件管理
  • 编程技能:字符串函数04,直接使用 strcpy,解决报错
  • 【Lua】java 调用redis执行 lua脚本