从JSON数据提取嵌套字段并转换为独立列的简洁方法
从JSON数据提取嵌套字段并转换为独立列的简洁方法
在数据处理和数据分析的日常工作中,我们经常遇到复杂的嵌套数据结构,特别是嵌入在JSON字段中的数据。这些数据往往需要解析并展开成独立的列,以便后续分析和建模。本文将详细介绍如何在Python中使用pandas高效地解析和处理嵌套的JSON数据,避免显式循环,实现简洁且高效的代码。我们将逐步讲解一个实际案例,展示如何提取嵌套字段并将其转换为新的独立列。
案例概述
假设我们有一个DataFrame,其中包含两个列:id 和 json_data,json_data 中嵌套了复杂的JSON结构。我们希望从中提取出嵌套的字段 a_name 和 b_name,并将其作为新的独立列。同时,还需要将顶层的字段 name、age 和 city 也提取到最终的 DataFrame 中。
以下是我们的原始数据:
import pandas as pd# 示例数据
df = pd.DataFrame({'id': [1, 2],'json_data': ['{"name": "John Doe", "age": 30, "city": "New York", "js_obj": [{"a_name": "AA", "b_name": "BB"}, {"a_name": "CC", "b_name": "DD"}]}','{"name": "Jane Doe", "age": 25, "city": "Los Angeles", "js_obj": [{"a_name": "EE", "b_name": "FF"}, {"a_name": "GG", "b_name": "HH"}]}']
})
目标是将 json_data 列解析为独立的字段,使每个嵌套对象 a_name 和 b_name 成为 DataFrame 的独立行,结果应如下所示:
| id | name | age | city | a_name | b_name |
|---|---|---|---|---|---|
| 1 | John Doe | 30 | New York | AA | BB |
| 1 | John Doe | 30 | New York | CC | DD |
| 2 | Jane Doe | 25 | Los Angeles | EE | FF |
| 2 | Jane Doe | 25 | Los Angeles | GG | HH |
步骤一:加载和解析JSON数据
首先,我们需要将 json_data 列从字符串转换为字典格式。可以使用 json.loads() 函数来实现这一点。
import json# 将 json_data 列解析为字典
df['json_data'] = df['json_data'].apply(json.loads)
此时,每个 json_data 字段已转换为字典格式,便于进一步处理。
步骤二:提取顶层字段
我们可以使用 pd.json_normalize() 轻松提取 json_data 中的顶层字段 name、age 和 city。
# 提取顶层字段
df[['name', 'age', 'city', 'js_obj']] = pd.json_normalize(df['json_data'])[['name', 'age', 'city', 'js_obj']]
这一步会创建新的 name、age、city 和 js_obj 列,并将 js_obj 保留为嵌套的列表对象。
步骤三:展开嵌套列表
为了将 js_obj 列中的嵌套列表展开为独立行,我们可以使用 explode() 方法。此方法能够将列表内的每个元素分解为独立的行,从而实现数据扁平化。
# 展开 js_obj 列
expanded_df = df.explode('js_obj').reset_index(drop=True)
此时,每个 js_obj 列中的嵌套对象都变成了 DataFrame 的独立行。接下来需要将 js_obj 字段进一步展开为 a_name 和 b_name 列。
步骤四:将嵌套对象展开为独立列
使用 pd.json_normalize() 可以将嵌套字典对象展开为独立列。我们再次应用该方法来提取 js_obj 字段中的 a_name 和 b_name。
# 将 js_obj 列展开为单独的列
expanded_df[['a_name', 'b_name']] = pd.json_normalize(expanded_df['js_obj'])
步骤五:清理数据
为了获得最终结果,我们删除原始的 json_data 和 js_obj 列,只保留所需的字段。
# 删除不需要的列
expanded_df = expanded_df.drop(columns=['json_data', 'js_obj'])# 查看结果
print(expanded_df)
最终结果
| id | name | age | city | a_name | b_name |
|---|---|---|---|---|---|
| 1 | John Doe | 30 | New York | AA | BB |
| 1 | John Doe | 30 | New York | CC | DD |
| 2 | Jane Doe | 25 | Los Angeles | EE | FF |
| 2 | Jane Doe | 25 | Los Angeles | GG | HH |
详细解释
为什么使用 pd.json_normalize()
pd.json_normalize() 是 pandas 中处理嵌套JSON数据的强大工具。它能在不显式编写循环的情况下,将嵌套字典或列表展开为平面表格结构,从而显著减少代码量并提高可读性。
explode() 的作用
explode() 方法能够将列表列展开为多个独立行。对于处理嵌套数据特别有用,如本例中的 js_obj 字段。如果没有该方法,我们将需要编写显式循环来手动展开,这样不仅繁琐,而且容易出错。
总结
通过本文的讲解,你已经掌握了如何在Python中使用 pandas 处理嵌套的JSON数据并将其展开为独立列。本文中的方法避免了显式循环,使用 pandas 内置的 json_normalize() 和 explode() 函数,使代码更简洁、更高效。
扩展阅读
- 官方文档:pandas.json_normalize
- 官方文档:pandas.DataFrame.explode
这些工具和方法为处理复杂JSON结构的数据提供了极大的便利,是数据工程师和数据分析师的重要技能。希望这篇文章能帮助你在日常工作中更高效地处理数据!
相关文章:
从JSON数据提取嵌套字段并转换为独立列的简洁方法
从JSON数据提取嵌套字段并转换为独立列的简洁方法 在数据处理和数据分析的日常工作中,我们经常遇到复杂的嵌套数据结构,特别是嵌入在JSON字段中的数据。这些数据往往需要解析并展开成独立的列,以便后续分析和建模。本文将详细介绍如何在Pyth…...
湘潭大学软件工程算法设计与分析考试复习笔记(四)
回顾 湘潭大学软件工程算法设计与分析考试复习笔记(一)湘潭大学软件工程算法设计与分析考试复习笔记(二)湘潭大学软件工程算法设计与分析考试复习笔记(三) 前言 现在是晚上十一点,我平时是十…...
特征交叉-DeepCross Network学习
一 tensorflow官方实现 tensorflow的官方实现已经是V2版本 class Cross(tf.keras.layers.Layer):"""Cross Layer in Deep & Cross Network to learn explicit feature interactions.Args:projection_dim: int,低秩矩阵的维度,应该小…...
stm32cubemx+VSCODE+GCC+makefile 开发环境搭建
title: stm32cubemxVSCODEGCCmakefile 开发环境搭建 tags: FreertosHalstm32cubeMx 文章目录 内容往期内容导航第一步准备环境vscode 插件插件配置点灯 内容 往期内容导航 第一步准备环境 STM32CubeMXVSCODEMinGWOpenOcdarm-none-eabi-gcc 然后把上面下载的软件 3 4 5 bin 文…...
Go语言中的Defer机制详解与示例
在Go语言中,defer是一个关键字,用于确保资源的清理和释放,特别是在函数中创建的资源。defer语句会将其后的函数调用推迟到包含它的函数即将返回时执行。这使得defer成为处理文件关闭、数据库连接释放、解锁等资源清理操作的理想选择。 Defer…...
H.265流媒体播放器EasyPlayer.js H5流媒体播放器如何验证视频播放是否走硬解
随着技术的不断进步和5G网络的推广,中国流媒体播放器行业市场规模以及未来发展趋势都将持续保持稳定的增长,并将在未来几年迎来新的发展机遇。流媒体播放器将继续作为连接内容创作者和观众的重要桥梁,推动数字媒体产业的创新和发展。 EasyPla…...
ms-hot目录
1. ms-hot1...
vulfocus在线靶场:骑士cms_cve_2020_35339:latest 速通手册
目录 一、启动环境,访问页面,ip:端口号/index.php?madmin,进入后台管理页面,账号密码都是adminadmin 二、进入之后,根据图片所示,地址后追加一下代码,保存修改 三、新开标签页访问:①ip:端…...
AI Large Language Model
AI 的 Large Language model LLM , 大语言模型: 是AI的模型,专门设计用来处理自然语言相关任务。它们通过深度学习和庞大的训练数据集,在理解和生成自然语言文本方面表现出色。常见的 LLM 包括 OpenAI 的 GPT 系列、Google 的 PaLM 和 Meta…...
React Native的`react-native-reanimated`库中的`useAnimatedStyle`钩子来创建一个动画样式
React Native的react-native-reanimated库中的useAnimatedStyle钩子来创建一个动画样式,用于一个滑动视图的每个项目(SliderItem)。useAnimatedStyle钩子允许你根据动画值(在这个例子中是scrollX)来动态地设置组件的样…...
FastJson反序列化漏洞(CVE-2017-18349)
漏洞原理 原理就不多说了,可以去看我这篇文章,已经写得很详细了。 Java安全—log4j日志&FastJson序列化&JNDI注入-CSDN博客 影响版本 FastJson<1.2.24 复现过程 这里我是用vulfocus.cn这个漏洞平台去复现的,比较方便&#x…...
【优选算法篇】分治乾坤,万物归一:在重组中窥见无声的秩序
文章目录 分治专题(二):归并排序的核心思想与进阶应用前言、第二章:归并排序的应用与延展2.1 归并排序(medium)解法(归并排序)C 代码实现易错点提示时间复杂度和空间复杂度 2.2 数组…...
C++:探索AVL树旋转的奥秘
文章目录 前言 AVL树为什么要旋转?一、插入一个值的大概过程1. 插入一个值的大致过程2. 平衡因子更新原则3. 旋转处理的目的 二、左单旋1. 左单旋旋转方式总处理图2. 左单旋具体会遇到的情况3. 左单旋代码总结 三、右单旋1. 右单旋旋转方式总处理图2. 右单旋具体会遇…...
2. Django中的URL调度器 (自定义路径转换器)
在 Django 中,URL 路由通常使用路径转换器(path converters)来匹配和捕获 URL 中的特定模式,例如整数、字符串或 slug 等。默认情况下,Django 提供了一些内置的路径转换器,如 <int>、<str>、&l…...
深度学习:神经网络中线性层的使用
深度学习:神经网络中线性层的使用 在神经网络中,线性层(也称为全连接层或密集层)是基础组件之一,用于执行输入数据的线性变换。通过这种变换,线性层可以重新组合输入数据的特征,并将其映射到新…...
【刷题】算法设计题+程序设计题【2】2019-2024
11.202019年真题*2BST二叉排序树分裂、双向冒泡排序 2019 真题 【2019 1】编写算法,将一棵二叉排序树 分解成两棵二叉排序树 t1和t2,使得t1中的所有结点关键字的值都小于x,t2中所有结点关键字都大于x。 typedef struct BSTNode{int data;str…...
搭建es环境
centos7搭建elasticsearch环境 首先考虑使用 Docker 来安装 Elasticsearch、Kibana 和 Logstash。在安装过程中,可能会遇到一些问题,但通过适当的方法可以解决。 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.14.3 首先创建一个网络&a…...
阿里云和七牛云对象存储区别和实现
七牛云对象存储操作(QiniuUtil) 配置:使用 com.qiniu.storage.Configuration 类来配置上传设置,如指定区域(Region)和分片上传版本。上传管理器:通过 UploadManager 类来处理文件上传。认证&am…...
uniapp微信小程序接入airkiss插件进行WIFI配网
本文可参考uniapp小程序插件 一.申请插件 微信公众平台设置页链接:微信公众平台 登录您的小程序微信公众平台,进入设置页,在第三方设置->插件管理->添加插件中申请AiThinkerAirkissforWXMini插件,申请的插件appId为【wx6…...
03 —— Webpack 自动生成 html 文件
HtmlWebpackPlugin | webpack 中文文档 | webpack中文文档 | webpack中文网 安装 npm install --save-dev html-webpack-plugin 下载html-webpack-plugin本地软件包 npm i html-webpack-plugin --save-dev 配置webpack.config.js让webpack拥有插件功能 const HtmlWebpack…...
Python开发环境搭建新选择:Miniconda-Python3.11镜像体验
Python开发环境搭建新选择:Miniconda-Python3.11镜像体验 1. 为什么选择Miniconda-Python3.11镜像 Python作为当今最流行的编程语言之一,其版本管理和环境隔离一直是开发者面临的挑战。传统的Python安装方式往往会导致: 系统Python版本与项…...
YOLOv8改进:MixUp with Consistency——基于混合增强与一致性正则化的鲁棒性目标检测算法
1. 引言目标检测作为计算机视觉领域的核心任务之一,在实际应用中面临着诸多挑战,如光照变化、遮挡、图像噪声以及数据分布偏移等问题。YOLOv8作为当前最先进的目标检测器之一,凭借其高效的网络结构和优秀的性能表现,已在工业界和学…...
Qwen3.5-4B-Claude-Opus实战案例:用该模型辅助撰写RFC文档与技术决策说明
Qwen3.5-4B-Claude-Opus实战案例:用该模型辅助撰写RFC文档与技术决策说明 1. 模型特性与RFC文档撰写需求 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF作为一款专注于推理分析的AI模型,其结构化思维和分步骤回答能力特别适合技术文档撰写场景…...
UndertaleModTool:解锁游戏修改的无限可能
UndertaleModTool:解锁游戏修改的无限可能 【免费下载链接】UndertaleModTool The most complete tool for modding, decompiling and unpacking Undertale (and other Game Maker: Studio games!) 项目地址: https://gitcode.com/gh_mirrors/un/UndertaleModTool…...
高分二号卫星全解析:从光谱波段到城市管理的实战应用
1. 高分二号卫星的技术参数详解 高分二号卫星作为我国首颗亚米级高分辨率民用光学遥感卫星,其技术参数直接决定了它在城市管理中的应用能力。先说说最核心的空间分辨率:全色波段0.8米意味着能清晰识别小轿车级别的物体,多光谱3.2米分辨率则适…...
Logisim实战:从零到一构建MIPS32控制器核心模块
1. 初识MIPS32控制器设计 第一次接触MIPS32控制器设计时,我完全被那些密密麻麻的电路图和晦涩的指令格式搞懵了。记得当时在头歌平台上做实验,盯着Logisim界面整整半小时都不知道从何下手。后来才发现,理解控制器核心模块其实就像搭积木&…...
手把手教你读懂SAP SD定价中的红绿灯图标(KINAK字段全解析)
SAP SD定价红绿灯图标全解析:从业务逻辑到实战诊断 在SAP SD模块的日常操作中,定价条件的有效性判断直接影响着销售订单的准确性和业务决策效率。那些看似简单的红绿灯图标背后,隐藏着复杂的业务规则和系统逻辑。本文将带您深入理解KINAK字段…...
AI 创作者指南:04.AI写作:从草稿到润色的全流程协作
第4篇AI写作:从草稿到润色的全流程协作 第一部分创意引擎学完,你现在灵感满池、选题稳稳、观点锋利,是不是已经跃跃欲试想动笔了?😊 来,正式进入第二部分:AI作为写作与表达助手! 今天第4篇——AI写作:从草稿到润色的全流程协作。 咱们还是老朋友喝茶模式:AI不是让你…...
避坑指南:CentOS7部署LibreNMS常见错误及解决方案
CentOS7部署LibreNMS避坑实战:从SELinux到数据库权限的深度排错指南 对于网络监控系统的部署,LibreNMS以其开源特性和强大功能成为众多技术团队的首选。但在CentOS7环境下,从系统配置到服务调优的每个环节都可能成为阻碍顺利部署的暗礁。本文…...
显卡接口大乱斗:VGA、DVI、HDMI、DP到底怎么选?附2023年显示器搭配指南
显卡接口终极指南:VGA、DVI、HDMI、DP的2023年实战选择策略 当你面对显示器背面那一排形状各异的接口时,是否曾感到无从下手?VGA的蓝色老将、DVI的白色宽口、HDMI的扁平设计、DP的直角造型——这些看似简单的接口背后,藏着影响画面…...
