拯救pandas计划(22)——再话extract和extractall

最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投向其他的数据操作库,身为一个数据工作者,基本上是张口pandas,闭口pandas了,故而写下此系列以让更多的小伙伴们爱上pandas。

系列文章说明:

系列名(系列文章序号)——此次系列文章具体解决的需求

平台:

  • windows 10

  • python 3.8

  • pandas >=1.2.4

/ 数据需求

对指定列提取指定字符。

import pandas as pddata = {'num': ['1-3\n-7', '2', '1-5', '3-5-8\n', '0-4-5-10', '4-81-15'],'string': ['打水泥打灰,需要水泥打灰,搅拌下', '我不打灰谁打灰', '不想打灰了', '打点灰吧,要不去搬袋水泥', '搬水泥,打灰,搅拌均匀', '搅拌,搅拌……']
}
df = pd.DataFrame(data)

/ 需求处理

在处理需求之前,先解释下这两个方法的参数,在拯救pandas计划(18)——统计列中元素包含某字符的次数中是有使用过extractall,在此进行一个补充说明,值得注意的是,仅能作用在字符串上。

  • pd.Series().str.extract

pat : str 正则表达式
flags : int, 匹配规则,如忽略大小写,跨行匹配,默认0
expand : bool, 是否将结果展开成DataFrame类型
  • pd.Series().str.extractall

pat : str 正则表达式
flags : int, 匹配规则,如忽略大小写,跨行匹配,默认0

虽然参数上少了一个,但相比下,是以组的形式进行返回,多个结果是以match作为索引放置。

下面拟定一些需求并进行处理:

  1. 提取num列中的第一个数字

df['num'].str.extract(r'(\d)')

默认expand为True,返回的结果是DataFrame类型,可以改成False,那么返回值就是Series,写法类似于re中的search函数,需要用括号将需要提取的值括起来,当然也能设置返回的列名。

df['num'].str.extractall(r'^(\d)')

对比extractextractall的表达式更为细致,如不在表达式中添加^符号以表明只匹配首字符,那么会将待匹配字符串中符合表达式的字符全部提取出来,extract有点像re.match,结果会多生成一个名为match的索引,来记录每行匹配到的顺序。

  1. 提取num列中首尾的两个字符且为数字

import redf['num'].str.extract(r'^(\d)?.*?(\d)$', re.S)

这里用re.S模式,让.可以匹配换行符,当匹配的组数多了,对应生成的列就多了,自然expand的参数就无效了,同样也能用?P设置返回的列名。

适应只有一个字符的情况,将匹配的第一个字符做了可有可无处理,比如num列的第二个数据,其中只有一个2,可以按情形设置匹配的表达式。

import redf['num'].str.extractall(r'^(\d)?.*?(\d)$', re.S)

除会多生成一个match索引外,两者没有其他区别。

  1. 匹配string列中包含给定的两个关键字中的其中一个

df['string'].str.extract(r'(水泥|打灰)')
df['string'].str.extractall(r'(水泥|打灰)')

在括号中写上两个关键字,用竖线|隔开,可以看到两种方法的结果区别很明显,左边只匹配返回第一个匹配到的关键字,而右边将所有能匹配到的都会返回。

  1. 匹配返回string列中两个关键字都存在的行

extract需要用单句表达式进行重复匹配,换言之,使用断言的方式,匹配到一个关键词,从开始处匹配另一个关键词。

df['string'].str.extract(r'(?=.*打灰)(?=.*水泥)(.*)')

这里用(.*)作为返回的结果,需要注意的是,如果需要.能匹配\n,用re.S模式。

extractall除使用同样的表达式之外,在上一个方法能得知,会将所有符合条件的部分都返回,那么可以对结果进行分组去重统计,如果统计结果等于关键字的数量,就说明都存在,进而返回符合条件的行。

keywords = ['水泥', '打灰']
# 构造表达式
pattern = '|'.join(keywords)  # 水泥|打灰
# 匹配字符串
extract = df['string'].str.extractall(fr'({pattern})').groupby(level=0).nunique()
# 返回满足条件的行
df.loc[extract[extract[0] == len(keywords)].index]

/ 总结

本篇通过几个小的示例代码简单地对extractextractall的用法进行说明,可以类比re模块的findall、search、match函数,这两种方法需要有对正则表达式的掌握度,通过正则表达式将数据提取成多列数据,也能结合其他方法来转换处理成目标结果。

也许我们的存在并不能让这个世界发生重大的变化,坚持或许才能离成功更接近。


于二零二二年七月十一日作

拯救pandas计划(22)——再话extract和extractall相关推荐

  1. 拯救pandas计划(7)——对含金额标志的字符串列转换为浮点类型数据

    拯救pandas计划(7)--对含金额标志的字符串列转换为浮点类型数据 / 数据需求 / 需求拆解 / 需求处理 方法一 方法二 / 总结 最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投 ...

  2. 拯救pandas计划(16)——将DataFrame的奇偶列位置进行前后对调

    拯救pandas计划(16)--将DataFrame的奇偶列位置进行前后对调 / 数据需求 / 需求拆解 / 需求处理 / 总结 最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投向其他的数 ...

  3. python进阶22再识单例模式

    原创:python进阶22再识单例模式 父子进程内部变量是否可以直接共享,当然不是,需要"特殊加工"下才行. 那么在web开发中的单例模式,是真正的全局唯一的单例么?自然也是否 惭 ...

  4. 顶点计划2-2调研报告

    顶点计划2-2组:关于大学内传单问题的调研 第一轮:经过小组讨论,我们确定了一个主要矛盾:发传单的人想要将一些信息通过传单的方式进行宣传,但收单的人因为感到生活受到影响而对传单产生排斥. 一方面,从发 ...

  5. 最全MySQL8.0实战教程 22 MySQL的优化 22.4 explain分析执行计划 22.4.1 基本使用

    最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 22 MySQL的优化 22.4 explain分析执行计划 22.4.1 基本使用 [黑马程序员MySQL知识精讲+mysql实 ...

  6. 来听听外国UX设计师的22句话

    设计师在工作中经常被各种改改改虐到痛不欲生,本文给大家总结了22个让你成为炫酷设计师的方法,新技能get起来! 1.在会议结束之前离场,临走前潇洒的挥挥手:"抱歉各位,我必须得先走一步了,还 ...

  7. gawk如何在win7安装_WIN7系统如何安装PS2021?拯救你的WIN7再战斗一年

    WIN7 系统如何安装 "PS 2021"? 拯救你的 WIN7 系统,再战斗一年! 首先紫枫要说明的是,在WIN7系统下正常情况是无法安装最新版本的 PS 2021的,PS 20 ...

  8. c++入门之 再话类

    对于类,其结构并不难,但要理解其设计思想也并不容易,在此,我们可以通过下面的代码进一步理解和使用类: 1 # ifndef VECTOR_H_ 2 # define VECTOR_H_ 3 # inc ...

  9. 再话单元测试unittest

    单元测试自然是对程序中最小的可测试模块--函数来进行测试:因为单元测试的对象是函数,也就是说你得被测试对象一定要有输出结果,哪怕就是异常输出,也得有输出,以便单元测试模块能够捕获返回值,并且与预期值进 ...

最新文章

  1. Case when then esle end
  2. 开始学习python的感受
  3. 【文本描述增强】标准屏幕字段文本描述更改增强
  4. python 输入10个整数_2019-07-18 python练习:编写一个程序,要求用户输入10个整数,然后输出其中最大的奇数,如果用户没有输入奇数,则输出一个消息进行说明。...
  5. myeclipse写简单bbs代码_RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?...
  6. Minimum grid
  7. 【HDU - 5878】I Count Two Three(打表)
  8. 【自动化测试】整理各种测试开发工具!持续更新
  9. 计算机二级c语言填空题答案唯一吗,计算机二级C语言上机填空题及答案.doc
  10. 02-HTML标签语法+字体标记
  11. 【图像检索】基于matlab Hu不变矩图像检索【含Matlab源码 755期】
  12. 服务器组态文件己写保护,组态王常见问题集锦(一)
  13. 如何把桌面计算机和回收站隐藏,电脑回收站怎么隐藏图标,隐藏我的电脑和回收站...
  14. shell小脚本--从laod博客更新hosts文件
  15. 如何防御DDoS等流量攻击?
  16. Controlling GC pauses with the GarbageFirst Collector
  17. 大咖们如何评判优秀架构师?
  18. 元素始终置于页面底部
  19. 使用诚龙网维PXE网克工具需注意的几点 不断更新中
  20. 四旋翼的非线性模型预测控制(MPC)

热门文章

  1. Linux使用nfs设置共享文件夹
  2. Flink教程(14)- Flink高级API(容错机制)
  3. (转)Facebook杯2013年编程挑战赛——预选赛题目及答案
  4. Oscar获奖影片《后人》高清720P中英双字下载
  5. 进度条,message
  6. jlink 刷固件简记
  7. 用.NET阻止AutoCAD对象被选中
  8. 【Python技能树共建】字符串方法
  9. 服务器的系统文件怎么恢复出厂设置,电脑恢复出厂设置有哪些方法?
  10. Linux中Mycat远程连接Mysql8.0提示密码错误