使用 Pandas 和正则表达式拆分包含分隔符和全大写值的列

使用 pandas 和正则表达式拆分包含分隔符和全大写值的列

本文档介绍了如何使用 Pandas 和正则表达式高效地将 DataFrame 中的一列按照特定分隔符(’ – ‘)和全大写字母组合进行拆分。我们将探讨两种主要方法:一种是使用 Pandas 内置的字符串操作 .str.extract(),另一种是结合使用 re 模块进行更灵活的模式匹配。通过这些方法,你可以轻松地将包含复杂模式的列拆分为多个有意义的列,从而简化数据分析和处理流程。

使用 Pandas 的向量化字符串操作

Pandas 提供了强大的向量化字符串操作,可以高效地处理 DataFrame 中的文本数据。以下是如何使用 .str.extract() 和正则表达式来拆分列的示例:

import pandas as pddf = pd.DataFrame({   'Value': ['Juan-Diva - HOLLS', 'Carlos - George - ESTE BAN', 'Javier Plain - Hotham Ham - ALPINE', 'Yul - KONJ KOL MON'],})# 正则表达式模式pattern = r'^(.*?) - ([A-Zs-]+)$'# 提取分组到两个新列df[['First', 'Last']] = df['Value'].str.extract(pattern)# 显示 DataFrameprint(df)

代码解释:

导入 Pandas: import pandas as pd 导入 Pandas 库,用于数据处理。创建 DataFrame: 创建一个包含示例数据的 DataFrame。正则表达式模式: pattern = r’^(.*?) – ([A-Zs-]+)$’ 定义了用于拆分字符串的正则表达式模式。这个模式的含义如下:^: 匹配字符串的开头。(.*?): 匹配任意字符(非贪婪模式),并将其捕获到第一个分组中。-: 匹配分隔符 ” – “。([A-Zs-]+): 匹配由大写字母、空格或连字符组成的字符串,并将其捕获到第二个分组中。$: 匹配字符串的结尾。提取分组: df[[‘First’, ‘Last’]] = df[‘Value’].str.extract(pattern) 使用 .str.extract() 方法和定义的正则表达式模式从 ‘Value’ 列中提取分组,并将结果分别存储到 ‘First’ 和 ‘Last’ 列中。显示 DataFrame: print(df) 打印修改后的 DataFrame,显示拆分后的结果。

输出:

                                Value                      First          Last0                   Juan-Diva - HOLLS                  Juan-Diva         HOLLS1          Carlos - George - ESTE BAN            Carlos - George      ESTE BAN2  Javier Plain - Hotham Ham - ALPINE  Javier Plain - Hotham Ham        ALPINE3                  Yul - KONJ KOL MON                        Yul  KONJ KOL MON

此代码使用正则表达式 r’^(.*?) – ([A-Zs-]+)$’ 和 .str.extract()。该模式旨在将字符串拆分为两部分:

^(.*?) 捕获字符串开头到最后一个 ” – ” 之间的内容。([A-Zs-]+)$ 捕获字符串的最后一段,该段必须仅包含大写字母、空格或连字符。

此模式确保拆分发生在最后一个 ” – ” 之后,后跟一系列大写字符、空格或连字符的字符串。

使用 re 模块的替代方法

虽然 Pandas 的向量化字符串操作通常更有效,但 re 模块提供了更大的灵活性。以下是如何使用 re 模块实现相同结果的示例:

import pandas as pdimport redf = pd.DataFrame({    'Value': ['Juan-Diva - HOLLS', 'Carlos - George - ESTE BAN', 'Javier Plain - Hotham Ham - ALPINE', 'Yul - KONJ KOL MON'],})# 用于拆分字符串的函数def split_value(s):    # 查找最后一次出现的 ' - ' 后跟大写字母    match = re.search(r'^(.*?) - ([A-Zs-]+)$', s)    if match:        return match.group(1), match.group(2)    else:        return s, None# 将函数应用于 'Value' 列中的每一行df[['First', 'Last']] = df['Value'].apply(lambda x: split_value(x)).tolist()print(df)

代码解释:

导入库: 导入 pandas 用于数据处理和 re 用于正则表达式操作。创建 DataFrame: 创建一个包含示例数据的 DataFrame。定义 split_value 函数:此函数接受一个字符串 s 作为输入。它使用 re.search 函数查找与正则表达式 r’^(.*?) – ([A-Zs-]+)$’ 匹配的模式。如果找到匹配项(if match:):match.group(1) 返回第一个捕获组的内容(在 ” – ” 之前的部分)。match.group(2) 返回第二个捕获组的内容(由大写字母、空格或连字符组成的部分)。函数返回这两个组的元组。如果没有找到匹配项(else:):函数返回原始字符串 s 和 None 的元组。应用函数并创建新列:df[‘Value’].apply(lambda x: split_value(x)) 将 split_value 函数应用于 ‘Value’ 列中的每个值。lambda x: split_value(x) 是一个匿名函数,它接受一个值 x 并将其传递给 split_value 函数。.tolist() 将 apply 方法的结果(一系列元组)转换为列表。df[[‘First’, ‘Last’]] = … 将列表中的元组分配给新的 ‘First’ 和 ‘Last’ 列。

输出:

                                Value                      First          Last0                   Juan-Diva - HOLLS                  Juan-Diva         HOLLS1          Carlos - George - ESTE BAN            Carlos - George      ESTE BAN2  Javier Plain - Hotham Ham - ALPINE  Javier Plain - Hotham Ham        ALPINE3                  Yul - KONJ KOL MON                        Yul  KONJ KOL MON

我使用 re.search 函数来根据指定的模式查找匹配项。模式 r’^(.*?) – ([A-Zs-]+)$’ 与上面使用的模式相同。如果找到匹配项,该函数将返回字符串的两个部分;否则,它将返回原始字符串和 ‘Last’ 列的 None。然后将结果转换为列表并分配给新列 ‘First’ 和 ‘Last’。

注意事项和总结

性能: 对于大型数据集,Pandas 的向量化字符串操作通常比使用 re 模块更有效。但是,对于更复杂的模式匹配,re 模块可能更灵活。正则表达式: 掌握正则表达式对于文本数据处理至关重要。确保理解所使用的模式,并根据需要进行调整。错误处理: 在实际应用中,需要考虑错误处理。例如,如果某些行的格式与预期不符,则需要添加适当的逻辑来处理这些情况。数据清洗 在拆分列之前,可能需要对数据进行清洗,例如删除前导或尾随空格。

总而言之,本文档介绍了两种使用 Pandas 和正则表达式拆分 DataFrame 中列的方法。通过选择合适的方法并根据需要调整正则表达式,你可以高效地处理和转换文本数据。

以上就是使用 Pandas 和正则表达式拆分包含分隔符和全大写值的列的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1376487.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 15:57:30
下一篇 2025年12月14日 15:57:45

相关推荐

  • 如何在Golang中定义变量与常量

    Go语言通过var、:=和const定义变量与常量,支持类型推导与批量声明;const结合iota可实现枚举;标识符首字母大小写决定作用域可见性,合理使用可提升代码可读性和安全性。 在Golang中,变量和常量的定义方式简洁且类型安全。正确使用它们能提升代码可读性和性能。 定义变量 Go语言提供多种…

    2025年12月16日
    000
  • 如何在Golang中使用测试覆盖率工具

    使用go test -cover生成测试覆盖率,结合-coverprofile输出数据文件,再用go tool cover -html可视化,可直观查看代码覆盖情况,绿色为已覆盖,红色为未覆盖,支持设置阈值和持续集成检查。 在Golang中使用测试覆盖率工具可以帮助你了解代码中哪些部分被测试覆盖,哪…

    2025年12月16日
    000
  • Go 语言中实现跨平台条件编译:深入理解构建约束与文件命名约定

    go 语言通过构建约束(build constraints)和特定的文件命名约定,提供了强大的跨平台条件编译能力。本文将详细介绍如何利用 `// +build` 指令定义编译标签,以及如何通过 `*_goos` 和 `*_goarch` 等文件命名模式,在不同操作系统、架构或特定条件下选择性地包含或…

    2025年12月16日
    000
  • Go语言数组复制详解:内置函数与深拷贝实现

    本文详细介绍了Go语言中复制数组和切片的各种方法。重点讲解了使用内置 `copy` 函数进行浅拷贝,以及针对多维数组进行深拷贝的实现方式。通过代码示例,清晰展示了不同场景下的复制操作,并提供了注意事项,帮助开发者选择合适的复制方案,避免潜在的陷阱。 Go语言提供了多种复制数组和切片的方式,选择合适的…

    2025年12月16日
    000
  • Go语言中模型(Model)的结构化实践与依赖管理

    本文探讨了在go语言企业级应用中,如何遵循惯用(idiomatic go)方式来有效组织数据模型,解决模型间循环依赖问题,并妥善管理数据库连接。文章强调将相关模型置于同一包内,并通过引入仓库(repository)模式实现数据访问与业务逻辑的分离,同时利用依赖注入来提供数据库连接,从而构建清晰、可维…

    2025年12月16日
    000
  • Go html/template 中 time.Time 类型格式化指南

    在 go 语言的 `html/template` 模板中,直接格式化 `time.time` 类型是一个常见需求。本文将详细介绍如何在不进行复杂类型转换的情况下,利用模板引擎的内置能力,直接在 html 模板中对 `time.time` 对象进行灵活的日期和时间格式化,从而避免 go 代码中的繁琐处…

    2025年12月16日 好文分享
    000
  • Go语言反射:动态提取结构体字段值到[]interface{}切片

    本文深入探讨了go语言中如何利用反射机制动态地从结构体中提取字段值,并将其封装为`[]interface{}`切片。这对于实现通用数据处理逻辑,例如动态构建sql插入语句或orm框架,至关重要。我们将通过具体代码示例,详细讲解如何使用`reflect.valueof`和`reflect.typeof…

    2025年12月16日
    000
  • Golang如何使用encoding/json处理JSON数据

    Go语言通过encoding/json实现JSON编解码,json.Marshal和Unmarshal用于结构体与JSON互转,字段需大写并可用tag自定义,支持omitempty忽略空值;反序列化时自动忽略多余字段;动态JSON可用map[string]interface{}解析,数值默认为flo…

    2025年12月16日
    000
  • Go语言:从io.Reader高效读取字符串内容

    本文详细介绍了在go语言中如何将`io.reader`接口的数据流转换为字符串。核心方法是利用`io/ioutil`包(或go 1.16+的`io`包)中的`readall`函数,将reader的内容一次性读取为字节切片,再将其转换为字符串。文章强调了正确的错误处理、go版本兼容性,并讨论了该方法在…

    2025年12月16日
    000
  • Go语言中高效处理大量Keep-Alive连接的策略

    本文探讨了go语言服务在处理数千个低请求率(rps)的keep-alive连接时所面临的性能挑战。核心策略包括利用进程间通信(ipc)机制(如json rpc通过unix或tcp套接字)进行负载分发,以突破单进程瓶颈。同时,文章强调了理解go运行时(goroutine调度器和垃圾回收器)的性能特性及…

    2025年12月16日
    000
  • Go语言Goroutine生命周期管理:深入理解主函数退出与并发协程同步

    本文深入探讨go语言中goroutine的生命周期管理,揭示主函数(main)在退出时不会等待其他非主goroutine完成的机制。通过示例代码,我们分析了这一行为可能导致的并发问题,并详细介绍了如何使用`sync.waitgroup`这一标准库工具,可靠地同步并发协程,确保所有任务在程序退出前得到…

    2025年12月16日
    000
  • Golang如何实现gRPC服务端流

    在Go中实现gRPC服务端流,需在.proto文件定义返回stream的接口,生成代码后服务端使用Send()发送多条消息,客户端通过Recv()循环接收直至EOF,适用于日志推送等持续数据传输场景。 在Go语言中实现gRPC服务端流(Server Streaming RPC),核心是让服务器在接收…

    2025年12月16日
    000
  • Go语言反射:深入理解指针类型与结构体字段的实例化及修改

    本文将详细阐述在go语言中使用反射处理指针类型(如`*model.company`)的场景。我们将学习如何通过`reflect.new`和`reflect.elem`方法,从一个指向结构体的指针类型中,实例化出其底层结构体,并安全地修改其内部字段,从而实现动态类型操作。 在Go语言的反射机制中,处理…

    2025年12月16日
    000
  • 如何在Golang中对错误进行链式包装

    从Go 1.13起,errors包支持通过%w包装错误,形成可追溯的错误链,使用errors.Unwrap解包,errors.Is和errors.As判断和提取特定错误,提升错误处理与调试能力。 在Go语言中,从1.13版本开始,errors 包引入了对错误包装(error wrapping)的支持…

    2025年12月16日
    000
  • 将字符串映射到多种类型的 JSON 对象:Go 语言实践指南

    本文介绍了如何在 Go 语言中创建能够映射字符串到多种类型的 JSON 对象。由于 Go 语言的类型特性,直接创建 map[string]string 或 map[string]int 类型的映射无法满足需求。本文将展示如何利用 interface{} 类型来实现动态类型的 JSON 对象构建,并提…

    2025年12月16日
    000
  • 从 Go 切片获取底层数组

    本文旨在阐明 Go 语言中切片与底层数组的关系,并解释为什么无法直接从切片获取其底层数组。我们将深入探讨切片的本质,并通过示例代码和注意事项,帮助读者更好地理解 Go 语言中切片的使用。 理解 Go 切片与底层数组 在 Go 语言中,切片(slice)是一种动态数组,它提供了对数组部分区域的引用。当…

    2025年12月16日
    000
  • Go语言mgo操作MongoDB:math/big.Int类型的高效存储与检索

    本文详细介绍了在go语言中使用mgo库将`math/big.int`类型数据存入mongodb的方法。通过实现`bson.getter`接口,可以将`big.int`序列化为字符串存储;同时,利用`bson.setter`接口在数据检索时反序列化回`big.int`,从而解决了mgo默认无法直接处理…

    2025年12月16日
    000
  • Go语言结构体多标签定义:BSON与JSON序列化实践

    本文详细介绍了go语言中如何在结构体字段上定义多个标签,例如同时支持bson和json序列化。核心在于使用空格而非逗号作为不同标签之间的分隔符。文章通过示例代码和官方文档引用,清晰阐述了这一规则,帮助开发者正确处理多标签场景下的数据编解码需求,确保数据在不同系统间的兼容性与一致性。 理解Go结构体标…

    2025年12月16日
    000
  • Go html/template 中 time.Time 格式化显示指南

    本文详细介绍了在 go 语言的 `html/template` 模板中如何高效且灵活地格式化 `time.time` 类型数据。通过直接在模板内调用 `time.time` 对象的 `format` 方法,开发者可以避免复杂的类型转换问题,并以多种自定义格式呈现日期和时间信息,极大提升了模板渲染的便…

    2025年12月16日
    000
  • Go语言中判断字符串是否为空的最佳实践

    在go语言中,判断字符串是否为空是日常编程中常见的操作。go社区提供了两种主要且惯用的方法来完成这项任务:通过检查字符串的长度是否大于零,或者直接将字符串与空字符串进行比较。这两种方法都在go的标准库中被广泛使用,并且由于go编译器的智能优化,它们在执行效率上几乎是等效的。 两种常用的空字符串判断方…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信