pandas提取键值对(json和非json格式)

news2024/11/23 11:48:06

(欢迎大家关注我的公众号机器学习面试基地”,之后将在公众号上持续记录本人从非科班转到算法路上的学习心得、笔经面经、心得体会。未来的重点也会主要放在机器学习面试上!)


最近工作中需要解析一些有模型输入输出信息的csv日志,主要是键值对的形式,大概有两种情形:

情形一:标准的json字符串格式

也就是需要解析的字段为标准的json字符串:
在这里插入图片描述
然后需要将每个json字符串中的每一个键解析为新的一列(列名也需要保持相同),即以下的格式:
在这里插入图片描述
那么用到以下代码即可:

import pandas as pd
import json
#示例数据定义
df1 = pd.DataFrame({'params':['{"param1":5,"param2":2,"param3":1}','{"param1":6,"param2":3,"param3":5}','{"param1":9,"param2":3,"param3":5}'],'results':['{"class1":0.1,"class2":0.9}','{"class1":0.3,"class2":0.7}','{"class1":0.2,"class2":0.8}']})
df1 = df1.join(df1['params'].apply(lambda x:json.loads(x)).apply(pd.Series))#json格式解析
df1 = df1.join(df1['results'].apply(lambda x:json.loads(x)).apply(pd.Series))#json格式解析
df1 = df1.drop(['params','results'],axis=1)#丢弃原字段
  • 核心就在于利用apply函数,也就是上面的apply(lambda x:json.loads(x))apply(pd.Series))
    • 其中第一个apply结合lambda函数对json格式进行解析,会将原始的json字符串解析为python的字典格式,
    • 然后通过apply(pd.Series))来将解析后的键值对其拆分为对应的列,即每个键对应一个列。

情形二:不规则的键值对

该情形主要是针对需要解析的字段为非json格式的,比如:
在这里插入图片描述
同样需要解析为下面的格式,并将键名作为新的列名:
在这里插入图片描述
那么用下面的代码即可做到:

#示例数据
df2 = pd.DataFrame({'params':['param1=5|param2=2|param3=8','param1=4|param2=2|param3=2','param1=2|param2=2|param3=5']})
#解析
parse = (df2.params.str.extractall('([^|]+)=([^|]+)')
.reset_index(level=1,drop=True)
.set_index(0,append=True)[1]
.unstack(level=1))

整体解析麻烦了一些,但是掌握后就会很方便,因为复制好模板代码后只需要简单修改,就能进行解析。对于上面主要需要修改的部分则是extractall里的正则匹配部分。下面简单对上面的代码做一个拆分(如果要深入研究的话,需要去学习正则匹配,这里只做简单介绍)

  1. df2.params为指定某一列,也可以用df2[‘params’]

  2. .str即将目标列转换为string格式

  3. extractall()则是通过正则匹配获取所有满足目标格式的键值对

    • '([^|]+)=([^|]+)'代表了我们想要的匹配格式,主要分为([^|]+)、=、([^|]+)三个部分,也就是匹配’键=值‘的格式
      • ([^|]+)又分为()、[]、^、|、+五个部分
        • 其中()代表了整体打包,也即里面的是一个整体,比如(abc)?表示匹配abc这个字符串0次或者1次,如果不加(),即abc?的话则表示匹配ab或者abc,即?只对c生效而不是abc整体生效。
        • []表示单个匹配,即[]匹配一个字符,而非多个。比如[0-9]表示0-9之间的数都满足匹配要求,可以匹配0到9之间的单个数,但是不能匹配98,99
        • ^有两种用法,一是限定开头,比如(^cat)则限定开头为cat的字符串。第二种是代表’否’,也就是不匹配的意思,比如上面的[^|]则表示|外的所有字符。那么如何区分两种用法呢,就看^外面是不是紧挨着[],比如/[(^\s+)(\s+$)]/g就是限定开头的用法,而不是’否‘的用法。
        • +则表示多个的意思,也就是匹配多个[^|]
      • 针对我们的目标格式param1=5|param2=2|param3=8,其实我们需要提取的就是param1=5,那么|是多余的,所以用[^|]来排除|,由于param是一个字符串,因此需要用+来进行字符串匹配。最后利用()来将其打包为一个整体。
  4. reset_index(level=1,drop=True)用于重置索引,如果drop=True,则代表丢弃现有的索引,如果有多级索引,则需要用level参数指定需要丢弃的索引,如果没有指明level,则丢弃所有索引。重置前的结果如下,也就是出现了两级索引,这里删除第二级索引,也就是level=1(或者也可以写成level=‘match’):
    在这里插入图片描述
    重置后的结果如下
    在这里插入图片描述

  5. set_index(0,append=True)[1]中set_index代表将某一列设置为索引,append=True,则代表保留原索引,并将指定列作为索引附加到原索引上,也就是变成了两级索引。这里将param所在那一列变成了索引。set_index后的结果如下
    在这里插入图片描述
    注意后面还有个[1],这其实就是提取出列名为1的列,注意这里其实只有一列了,因为param那一列已经变成索引了,这一步后的结果如下:
    在这里插入图片描述

  6. 最后unstack(level=1))将指定level的索引,转变为列。最后就达到了我们的目的了:
    在这里插入图片描述

举一反三(进阶版)

假设中间的间隔符不规律:

df2 = pd.DataFrame({'params':['*param1=5&$param2=2|param3=8','param1=4|$param2=2|param3=2','param1=2|param2=2|param3=5']})
df2

在这里插入图片描述
那就把所有的不规则符号排除掉即可

parse = (df2.params.str.extractall('([^|*&$]+)=([^|*&$]+)')
.reset_index(level=1,drop=True)
.set_index(0,append=True)[1]
.unstack(level=1)
        )
parse

在这里插入图片描述
如果要把解析的字段加在原来的表上,那就用join即可:df2=df2.join(parse)
在这里插入图片描述

总结

几行代码包含pandas的诸多技巧,以及正则匹配的知识,对于不规则的键值对,其实只需要掌握正则匹配的原理,然后修改正则匹配处的代码即可,后面的几行代码也无需改动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot+Mybaits搭建通用管理系统实例七:访问接口Api层功能实现

一、本章内容 系统api接口层实现,实现系统对外接口相应功能定义及实现,并通过Swagger实现接口文档的自动生成。 完整课程地址 二、开发视频 SpringBoot+Mybaits搭建通用管理系统实例二:api层实现 三、代码实现 使用基类的方式实现各方法接口的抽象实现,使用泛型的方式指定具…

linux上配置jdk和maven环境 (deepin适用)

前言 安装那些,就不说了,应该大家都下好才来配置的,下载安装的话,直接解压到一个目录就好,给个链接给你 jdk8下载链接: https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 命…

Docker Buildkit(新增 --mount、--security、--network 等特性)

BuildKit是Docker官方社区推出的下一代镜像构建神器。 可以更加快速,有效,安全地构建docker 镜像,自 docker v18.06 版本起已经集成了该组件。 Buildkit 是下一代 docker 构建组件,拥有众多特性: 自动垃圾收集可扩展…

静态WEB容器镜像最小化实践

在现代的B/S架构应用中,我们会做前后端分离,某些前端Web服务会将编译完成的静态文件放到一个web服务器进行部署。例如,我的博客也是基于Hugo编译的静态文件来进行部署的。 那在容器化部署模式下,我们需要基于一个web服务的基础容…

js:什么是编译时和运行时

编译时 源代码编译为机器可执行的二进制码。 编译过程中一般会识别你代码中的语法错误等问题,这个错误就叫编译时错误,做的一些检查也叫做编译时类型检查或者静态类型检查,因为静态就意味着代码还没有放到内存里去运行,只是把代…

九.STM32F030C8T6 MCU开发之电源掉电数据保存案例

九.STM32F030C8T6 MCU开发之电源掉电数据保存案例 0.总体功能概述 使用STD库–en.stm32f0_stdperiph_lib_v1.6.0。 1.掉电数据保存背景 掉电保存数据的时间内 电源稳定。也就是数据保存时间要尽量短,电源稳定要尽量长。 第一种,采用备用电池的方法来实现,增加了电池和更…

DFS搜索和输出所有路径

文章目录1、DFS搜所有路径2、用栈记录和输出路径3、例题3.1 C代码3.2 Python代码4、真题4.1 C代码4.2 Python代码2022.12将出版蓝桥杯大赛用书《蓝桥杯大赛-程序设计竞赛专题挑战教程》,作者:蓝桥杯组委会、罗勇军。   这本书解析了蓝桥杯大赛的常见考…

PLC学习笔记(二):PLC结构(1)

目录: PLC学习笔记(一):概述 PLC学习笔记(二):PLC结构(1) PLC学习笔记(三):PLC结构(2) 🦁&…

嵌入式FreeRTOS学习十一,深入理解任务调度机制

一.任务调度机制 可抢占:高优先级的任务先运行时间片轮转:同优先级的任务轮流执行空闲任务礼让:如果有同是优先级为0的其他就绪任务,空闲任务主动放弃一次运行机会函数调用vTaskDelay( xDelay5ms )可以主动放弃任务执行&#xff…

大学物理·第8章【电磁感应、电磁场】

from now on, 以后的篇幅我都不会写太多了。因为效果也不一定有,还很浪费时间。 感应电动势 那个奥特曼变身器的符号是 磁链 看看划线公式即可 动生电动势:dξ vB dl 例 如果,到时候复习的时候觉得简单的话,就删掉好了 自感、互…

【HTML5】登录页面制作简易版

刚开始学习Java。文件的命名,讲道理应该以英文为主,但是英语又不好,所以只好用拼音,最痛苦的应该算是那些英语又不好,又想秀一下的程序员,一半英语一半拼音,如mainFangFa~~~你说看了糟心不糟心。…

山东大学线性代数-1-矩阵-1

目录 1.2 几种特殊的矩阵 1.2.1 方阵 1.2.2 零矩阵 1.2.3 对角矩阵 1.2.4 单位矩阵 1.2.5 数量矩阵 1.2.6 三角阵 1.2.7 梯形阵 1.3 矩阵的运算(一) 1.3.1 相等 1.3.2 加、减法 1.3.3 数乘 1.3.4 矩阵的乘法 1.4 矩阵的运算(二&#x…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.18 查询文档

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.18 查询文档4.18.1 查询文档4.18.2 小结4.18.3 总…

山东大学线性代数-3-n维向量

目录 3.1 n维向量及其线性运算 3.1.1 n维向量的概念 3.1.2 向量的相等 3.1.3 n维向量的线性运算 3.1.4 线性组合 3.1.5 向量组的等价 3.2 向量组的线性相关性 3.2.1 线性相关性的定义 3.2.2 特殊情形的线性相关性 3.3 相关性的判定及有关重要结论 3.3.1 线性相关与…

[MQ] SpringBoot使用直连交换机Direct Exchange

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

Bootstrap-栅格实例(二)

栅格实例 进入官网 选择3.0的中文文档: 选择组件: 选择缩放图: 选择这个,复制代码: 把代码拷贝到,新创建的模板固定container里面: 删除靠过来的多余的row: 修改div的calss&…

【信息奥赛实训】Week1——STL 与基础数据结构专题训练

【信息奥赛实训】Week1-Lab-STL 作者|Rickyの水果摊 时间|2022年11月20日 实训概要 实训专题 STL 与基础数据结构专题训练 实训目的 掌握STL常用的算法、容器、容器适配器的使用方法。能够利用STL的算法、容器、容器适配器求解问题。 题目列表 A&…

HTML小游戏9 —— 潜行游戏《侠盗罗宾汉》(附完整源码)

💂 网站推荐:【神级源码资源网】【摸鱼小游戏】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的计算机相关知…

紫外线杀菌器

一、概述 紫外线杀菌器是利用波长为225-275nm的紫外线对微生物的杀灭而使水中菌类得以净化。当水流经消毒仪时,高强度杀菌作用的紫外线即将水中细菌杀灭。本产品彻底解决了饮用水二次污染细菌超标问题,同时也适用于饮料、食品、游泳池等用水的消毒处理。…

Linux基本指令——综合操作

bc指令bc指令其实就是Linux下的计算器Ctrl c退出也可以通过管道进行输出。bc命令并不常用,主要是见见。uname -r指令语法:uname [选项]作用:uname可以用来获取电脑或者操作系统的相关信息。选项:-a或–all 详细输出所有信息&…