Pandas 字符串处理技巧:格式化、正则匹配与拼接操作

Pandas 字符串处理技巧:格式化、正则匹配与拼接操作

本文深入讲解了 Pandas 中常用的字符串处理方法,包括格式化字符、正则匹配和字符串拼接。文章介绍了如何使用 str.upper()str.lower() 等方法转换大小写,去除空白字符,以及使用 str.split() 分割字符串。接着,重点介绍了正则表达式在 Pandas 中的应用,如使用 str.contains()str.match() 进行模式匹配,利用 str.replace() 进行字符串替换,以及通过 str.extract()str.extractall() 提取符合正则规则的子字符串。最后,展示了 str.cat() 方法在字符串拼接中的应用。通过具体代码示例,帮助读者掌握高效的数据清洗与文本处理技巧。

文章目录

  • Pandas 字符串处理技巧:格式化、正则匹配与拼接操作
      • 一 主要涉及方法
      • 二 格式化字符
        • 1 Python原生转换大小写
        • 2 Pandas库中转换大小写
        • 3 Python原生去除空白
        • 4 Pandas库去除空白
        • 5 Python原生字符串分割
        • 6 Pandas库字符串分割
        • 注意事项
      • 三 正则匹配
        • 1 str.contains()
        • 2 str.match()
        • 3 str.replace()
        • 4 str.extract()
        • 5 str.extractall()
      • 四 拼接
      • 五 完整代码示例
      • 六 源码地址

预备课: Python 正则表达式详解:从基础匹配到高级应用

导入第三方库

import pandas as pd

一 主要涉及方法

格式化字符正则匹配拼接
str.upper(); str.lower(); str.len()str.contains(); str.match()str.cat()
str.strip(); str.lstrip(); str.rstrip()str.replace()
str.split()str.extract(); str.extractall()

二 格式化字符

1 Python原生转换大小写
    py_s = "A,B,C,Aaba,Baca,CABA,dog,cat"print("python:\n", py_s.upper())print("python lower:\n", py_s.lower())# 获取每个子串的长度print("python len:\n", [len(s) for s in py_s.split(",")])
2 Pandas库中转换大小写
    pd_s = pd.Series(["A", "B", "C", "Aaba", "Baca", "CABA", "dog", "cat"],dtype="string")print("\npandas:\n", pd_s.str.upper())print("\npandas lower:\n", pd_s.str.lower())# 获取每个字符串的长度print("\npandas len:\n", pd_s.str.len())
3 Python原生去除空白
    py_s = ["   jack", "jill ", "    jesse    ", "frank"]print("python strip:\n", [s.strip() for s in py_s])print("\n\npython lstrip:\n", [s.lstrip() for s in py_s])print("\n\npython rstrip:\n", [s.rstrip() for s in py_s])
4 Pandas库去除空白
    pd_s = pd.Series(py_s, dtype="string")print("\npandas strip:\n", pd_s.str.strip())print("\npandas lstrip:\n", pd_s.str.lstrip())print("\npandas rstrip:\n", pd_s.str.rstrip())
5 Python原生字符串分割
    py_s = ["a_b_c", "jill_jesse", "frank"]print("python split:\n", [s.split("_") for s in py_s])
6 Pandas库字符串分割
    pd_s = pd.Series(py_s, dtype="string")print("\npandas split:\n", pd_s.str.split("_"))

字符串扩展成一个DataFrame

    print(pd_s.str.split("_", expand=True))pd_df = pd.DataFrame([["a", "b"], ["C", "D"]], dtype="string")print(pd_df.iloc[0, :].str.upper())
注意事项

Pandas中的文字处理需要确保SeriesDataFramedtype="string"。如果不确定数据类型,可以使用str.astype("string")进行转换。

    pd_not_s = pd.Series(["A", "B", "C", "Aaba", "Baca", "CABA", "dog", "cat"],)print("pd_not_s type:", pd_not_s.dtype)pd_s = pd_not_s.astype("string")print("pd_s type:", pd_s.dtype)

三 正则匹配

1 str.contains()

str.contains() 方法是查找包含一个数字后跟一个小写字母的字符串。

    pattern = r"[0-9][a-z]"s = pd.Series(["1", "-i1a1-iii", "11c", "abc"], dtype="string")print(s.str.contains(pattern))

pattern = r"[0-9][a-z]":这个正则表达式匹配一个数字(0到9中的任意一个)后紧跟一个小写字母(从a到z)。[0-9] 表示数字的范围,[a-z] 表示小写字母的范围。

2 str.match()

str.match() 方法是检查字符串开头是否符合指定的正则表达式模式。

    s = pd.Series(["1", "1a", "11c", "abc"], dtype="string")pattern = r"[0-9]+?[a-z]"print(s.str.match(pattern))pattern = r"[0-9][a-z]"print(s.str.match(pattern))

第一个正则表达式:r"[0-9]+?[a-z]",匹配一个或多个数字,紧接着一个小写字母。

第二个正则表达式:r"[0-9][a-z]",匹配一个单独的数字后紧跟一个小写字母。

3 str.replace()

字符串替换方法。

    py_s = ["1", "1a", "21c", "abc"]pd_s = pd.Series(py_s, dtype="string")print("py_s replace '1' -> '9':\n", [s.replace("1", "9") for s in py_s])print("\n\npd_s replace '1' -> '9':\n", pd_s.str.replace("1", "9"))print("pd_s replace -> 'NUM':")print(pd_s.str.replace(r"[0-9]", "NUM", regex=True))

pandas支持正则表达式字符串替换。

4 str.extract()

str.extract() 用于从字符串中抽取符合正则表达式模式的子串,并以DataFrame的形式返回结果。字符串中的模式与正则表达式不匹配,则对应的列会填充 NaN

    s = pd.Series(['a1', 'b2', 'c3'])print(s)print(s.str.extract(r"([ab])(\d)"))

正则表达式 r"([ab])(\d)" 的含义是:

  • ([ab]):这个组匹配单个字符,要么是 'a' 要么是 'b'。这是一个捕获组,将匹配的结果保存下来。
  • (\d):这个组匹配单个数字(0-9)。这也是一个捕获组,将匹配的结果保存下来。
5 str.extractall()

str.extractall() 是 Pandas 提供的一种高效的字符串处理工具,能够从 SeriesDataFrame 的单列中提取出所有符合正则表达式的匹配项。不同于 str.extract() 只返回首个匹配项,str.extractall() 能识别并提取出每一处匹配,使其特别适合处理包含重复模式的数据。

s = pd.Series(['a1', 'b2', 'c3', 'a1a2'])
print(s.str.extractall(r"([ab])(\d)"))

运行结果

         0  1match      
0 0      a  1
1 0      b  2
3 0      a  11      a  2

这里,索引 0 和 1 对应原始 Series 中的前两个元素 'a1''b2',每个元素内部只有一个匹配,因此 match 都是 0。对于元素 'a1a2'(索引 3),存在两个匹配,分别是 'a1''a2',因此 match 索引分别是 0 和 1,表示它们是同一个字符串中的第一和第二个匹配。

四 拼接

str.cat() 方法是用于将一个字符串 Series 与另一个字符串或整个字符串 Series 连接起来。

s1 = pd.Series(["A", "B", "C", "D"], dtype="string")
print(s1)
s2 = pd.Series(["1", "2", "3", "4"], dtype="string")
print(s2)
print(s1.str.cat(s2))
print(s1.str.cat(s2, sep="-"))

sep="-" 指定了连接时使用的分隔符 "-",意味着每对连接的字符串之间都会加上一个 "-"

五 完整代码示例

# This is a sample Python script.# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.
import pandas as pddef print_hi(name):# Use a breakpoint in the code line below to debug your script.print(f'Hi, {name}')  # Press ⌘F8 to toggle the breakpoint.# 格式化字符# str.upper(); str.lower(); str.len()# str.strip(); str.lstrip(); str.rstrip()# str.split()# 正则方案# str.contains(); str.match();# str.replace()# str.extract(); str.extractall()# 拼接# str.cat()# 格式化字符py_s = "A,B,C,Aaba,Baca,CABA,dog,cat"print("python:\n", py_s.upper())print("python lower:\n", py_s.lower())print("python len:\n", [len(s) for s in py_s.split(",")])pd_s = pd.Series(["A", "B", "C", "Aaba", "Baca", "CABA", "dog", "cat"],dtype="string")print("\npandas:\n", pd_s.str.upper())print("\npandas lower:\n", pd_s.str.lower())print("\npandas len:\n", pd_s.str.len())print()pd_not_s = pd.Series(["A", "B", "C", "Aaba", "Baca", "CABA", "dog", "cat"],)print("pd_not_s type:", pd_not_s.dtype)pd_s = pd_not_s.astype("string")print("pd_s type:", pd_s.dtype)print()py_s = ["   jack", "jill ", "    jesse    ", "frank"]print("python strip:\n", [s.strip() for s in py_s])print("\n\npython lstrip:\n", [s.lstrip() for s in py_s])print("\n\npython rstrip:\n", [s.rstrip() for s in py_s])pd_s = pd.Series(py_s, dtype="string")print("\npandas strip:\n", pd_s.str.strip())print("\npandas lstrip:\n", pd_s.str.lstrip())print("\npandas rstrip:\n", pd_s.str.rstrip())py_s = ["a_b_c", "jill_jesse", "frank"]print("python split:\n", [s.split("_") for s in py_s])pd_s = pd.Series(py_s, dtype="string")print("\npandas split:\n", pd_s.str.split("_"))print(pd_s.str.split("_", expand=True))pd_df = pd.DataFrame([["a", "b"], ["C", "D"]], dtype="string")print(pd_df.iloc[0, :].str.upper())# 正则方案pattern = r"[0-9][a-z]"s = pd.Series(["1", "-i1a1-iii", "1c", "abc"], dtype="string")print(s.str.contains(pattern))s = pd.Series(["1", "1a", "11c", "abc"], dtype="string")pattern = r"[0-9]+?[a-z]"print(s.str.match(pattern))pattern = r"[0-9][a-z]"print(s.str.match(pattern))py_s = ["1", "1a", "21c", "abc"]pd_s = pd.Series(py_s, dtype="string")print("py_s replace '1' -> '9':\n", [s.replace("1", "9") for s in py_s])print("\n\npd_s replace '1' -> '9':\n", pd_s.str.replace("1", "9"))print("pd_s replace -> 'NUM':")print(pd_s.str.replace(r"[0-9]", "NUM", regex=True))s = pd.Series(['a1', 'b2', 'c3'])print(s)print(s.str.extract(r"([ab])(\d)"))s = pd.Series(['a1', 'b2', 'c3', 'a1a2'])print(s.str.extractall(r"([ab])(\d)"))# 拼接s1 = pd.Series(["A", "B", "C", "D"], dtype="string")print(s1)s2 = pd.Series(["1", "2", "3", "4"], dtype="string")print(s2)print(s1.str.cat(s2))print(s1.str.cat(s2, sep="-"))# Press the green button in the gutter to run the script.
if __name__ == '__main__':print_hi('文字处理')# See PyCharm help at https://www.jetbrains.com/help/pycharm/

复制粘贴并覆盖到你的 main.py 中运行,运行结果如下。

Hi, 文字处理
python:A,B,C,AABA,BACA,CABA,DOG,CAT
python lower:a,b,c,aaba,baca,caba,dog,cat
python len:[1, 1, 1, 4, 4, 4, 3, 3]pandas:0       A
1       B
2       C
3    AABA
4    BACA
5    CABA
6     DOG
7     CAT
dtype: stringpandas lower:0       a
1       b
2       c
3    aaba
4    baca
5    caba
6     dog
7     cat
dtype: stringpandas len:0    1
1    1
2    1
3    4
4    4
5    4
6    3
7    3
dtype: Int64pd_not_s type: object
pd_s type: stringpython strip:['jack', 'jill', 'jesse', 'frank']python lstrip:['jack', 'jill ', 'jesse    ', 'frank']python rstrip:['   jack', 'jill', '    jesse', 'frank']pandas strip:0     jack
1     jill
2    jesse
3    frank
dtype: stringpandas lstrip:0         jack
1        jill 
2    jesse    
3        frank
dtype: stringpandas rstrip:0         jack
1         jill
2        jesse
3        frank
dtype: string
python split:[['a', 'b', 'c'], ['jill', 'jesse'], ['frank']]pandas split:0        [a, b, c]
1    [jill, jesse]
2          [frank]
dtype: object0      1     2
0      a      b     c
1   jill  jesse  <NA>
2  frank   <NA>  <NA>
0    A
1    B
Name: 0, dtype: string
0    False
1     True
2     True
3    False
dtype: boolean
0    False
1     True
2     True
3    False
dtype: boolean
0    False
1     True
2    False
3    False
dtype: boolean
py_s replace '1' -> '9':['9', '9a', '29c', 'abc']pd_s replace '1' -> '9':0      9
1     9a
2    29c
3    abc
dtype: string
pd_s replace -> 'NUM':
0        NUM
1       NUMa
2    NUMNUMc
3        abc
dtype: string
0    a1
1    b2
2    c3
dtype: object0    1
0    a    1
1    b    2
2  NaN  NaN0  1match      
0 0      a  1
1 0      b  2
3 0      a  11      a  2
0    A
1    B
2    C
3    D
dtype: string
0    1
1    2
2    3
3    4
dtype: string
0    A1
1    B2
2    C3
3    D4
dtype: string
0    A-1
1    B-2
2    C-3
3    D-4
dtype: string

六 源码地址

代码地址:

国内看 Gitee 之 pandas/文字处理.py

国外看 GitHub 之 pandas/文字处理.py

引用 莫烦 Python

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

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

相关文章

Window 安装ack 搜索软件 及使用

1. 先安装 PowerShell 命令行工具 2. 通过该工具安装命令行包管理器工具 Chocolatey 命令&#xff1a; Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::SecurityProtocol -bor …

基于SSM的社区物业管理系统+LW参考示例

1.项目介绍 系统角色&#xff1a;管理员、业主&#xff08;普通用户&#xff09;功能模块&#xff1a;管理员&#xff08;用户管理、二手置换管理、报修管理、缴费管理、公告管理&#xff09;、普通用户&#xff08;登录注册、二手置换、生活缴费、信息采集、报事报修&#xf…

ubuntu中安装mysql

一、注意版本问题 ubuntu常用的版本是16.4&#xff0c;18.4,对应的mysql文件也不同&#xff0c;注意不要下载错误。 二、注意更换apt的源 sudo cat /etc/apt/sources.list查看现在的数据源&#xff0c;我更换了阿里的数据源。更换语句如下&#xff1a; sed -i s/http:\/\/…

2024数据库国测揭晓:安全与可靠的新标准,你了解多少?

2024年数据库国测的结果&#xff0c;于9月份的最后一天发布了。 对于数据库行业的从业者来说&#xff0c;国测是我们绕不过去的坎儿。那么什么是国测&#xff1f;为什么要通过国测&#xff0c;以及国测的要求有哪些&#xff1f; 这篇文章带大家一探究竟。 国测 自愿平等、客…

Ubuntu - 进入紧急模式,无法进入桌面

目录 一、问题 二、分析原因 三、解决 四、参考 一、问题 重新安装VMVare之后&#xff0c;将之前的虚拟机加载不进来 二、分析原因 查看系统错误日志 journalctl -xb | grep Failed mnt挂载找不到了 三、解决 查看系统错误日志 如果是磁盘错误&#xff0c;此时终端会有…

基于STM32的八位数码管显示Proteus仿真设计

基于STM32的八位数码管显示Proteus仿真设计 1.主要功能2.仿真设计3. 程序设计4. 设计报告5. 资料清单&下载链接 基于STM32的八位数码管显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;…

数据库管理-第257期 有好故事才能讲好故事(20241101)

数据库管理257期 2024-11-01 数据库管理-第257期 有好故事才能讲好故事&#xff08;20241101&#xff09;1 23c到23ai2 惊艳的APEX3 愿景到实现总结 数据库管理-第257期 有好故事才能讲好故事&#xff08;20241101&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文…

FreeRTOS 队列详解

目录 一、引言 二、FreeRTOS 队列的基本概念 1.定义与作用 2.队列的长度和数据大小 三、FreeRTOS 队列的特点 1.先进先出&#xff08;FIFO&#xff09;特性 2.值传递方式 3.多任务访问 4.阻塞机制 四、FreeRTOS 队列的操作方法 1.创建队列 2.写队列&#xff08;发送…

Java项目实战II基于Spring Boot的问卷调查系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 在当今信息爆炸的时代&#xff0c;问卷调查…

基于JavaWeb的宿舍管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

【电子通识】白皮书、应用手册、用户指南、快速入门指南一般的定义是什么?

一般大厂家的器件或模块,除了给数据表以外,还提供应用手册、技术说明、白皮书等各种文档资料。 如下图所示为ST25 NFC/RFID标签和读卡器的文件资料:其中就有技术说明、白皮书、应用手册等。 如下所示为TI INA228技术文档相关资料: 也有应用手册、用户指南、技术文章…

【真实对抗环境】MC-Net: Realistic Sample Generation for Black-Box Attacks

原文标题&#xff1a; MC-Net: Realistic Sample Generation for Black-Box Attacks 原文代码&#xff1a; https://github.com/jiaokailun/A-fast 发布年度&#xff1a; 2024 发布期刊&#xff1a; TIFS 目录 摘要背景创新点模型实验结论 摘要 One area of current research …

0-基于图的组合优化算法学习(NeurIPS 2017)(未完)

文章目录 Abstract1 Introduction2 图上的贪婪算法的通用表述Abstract 为NP-hard组合优化问题设计好的启发式或近似算法通常需要大量的专业知识和试错。我们能否自动化这个具有挑战性、乏味的过程,而不是学习算法呢?在许多实际应用中,通常是相同的优化问题一次又一次地被解…

ctfshow(316)--XSS漏洞--反射性XSS

Web316 进入界面&#xff1a; 审计 显示是关于反射性XSS的题目。 思路 首先想到利用XSS平台解题&#xff0c;看其他师傅的wp提示flag是在cookie中。 当前页面的cookie是flagyou%20are%20not%20admin%20no%20flag。 但是这里我使用XSS平台&#xff0c;显示的cookie还是这样…

AI 大模型重塑软件开发流程

一、AI 大模型的定义 AI 大模型是指具有大量参数和复杂结构的人工智能模型&#xff0c;通过在大规模数据上进行训练&#xff0c;可以学习到丰富的知识和模式。这些模型通常基于深度学习技术&#xff0c;如神经网络&#xff0c;能够处理自然语言、图像、音频等多种类型的数据&am…

LeetCode 3216. 交换后字典序最小的字符串[简单]

. - 力扣&#xff08;LeetCode&#xff09; 题目 给你一个仅由数字组成的字符串 s&#xff0c;在最多交换一次 相邻 且具有相同 奇偶性 的数字后&#xff0c;返回可以得到的字典序最小的字符串。 相同奇偶性&#xff1a;如果两个数字都是奇数或都是偶数&#xff0c;则它们具…

建筑行业员工离职SOP的数字化管理

在建筑行业&#xff0c;随着数字化转型的深入&#xff0c;对员工离职的标准操作程序&#xff08;SOP&#xff09;进行数字化管理变得尤为重要。这不仅有助于提高管理效率&#xff0c;还能确保离职流程的规范性和合规性。本文将探讨建筑行业如何通过数字化手段管理员工离职SOP&a…

【你也能从零基础学会网站开发】 SQL Server结构化查询语言数据操作应用--DML篇 浅谈SQL JOIN多表查询之FULL JOIN 全连接查询

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 FULL JOIN 全连…

高效数据集成:从旺店通到金蝶云

高效数据集成&#xff1a;从旺店通到金蝶云 旺店通旗舰奇门数据集成到金蝶云星空&#xff1a;柏为销售出库单07.25 在现代企业的运营中&#xff0c;数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将分享一个实际案例——如何通过轻易云数据集成平台&#xff0c;将旺…