从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…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...