讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

Seko
Seko

AI短剧一键生成成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

Pandas DataFrame中混合数据列的正则表达式模式提取与分析

雨明大大_3339

雨明大大_3339

发布时间:2025-11-26 15:05:01

|

761人浏览过

|

来源于php中文网

原创

pandas dataframe中混合数据列的正则表达式模式提取与分析

本文旨在详细讲解如何利用Pandas库的`str.extract()`方法,结合正则表达式从包含混合类型数据的DataFrame列中精确提取特定模式。我们将深入探讨正则表达式的构建技巧,特别是处理多个可选模式和特殊字符的方法,并提供实际代码示例,帮助读者高效地清洗和分析复杂数据集。

1. 引言:处理混合数据列的挑战

在数据处理过程中,尤其是在从Excel或其他非结构化源导入数据时,Pandas DataFrame的列常常会包含混合类型的数据,例如字符串、数字以及各种编码模式。从这类列中准确识别并提取出特定信息,是数据清洗和预处理的关键一步。传统的方法可能需要复杂的条件判断,而正则表达式(Regex)则提供了一种强大且灵活的模式匹配机制,能够高效地从复杂字符串中抽取出符合特定规则的数据。

2. Pandas str.extract() 方法简介

Pandas为字符串操作提供了一系列便捷的方法,集成在DataFrame或Series的.str访问器中。其中,str.extract()方法专门用于通过正则表达式从字符串中提取匹配的子串。它返回一个DataFrame,其中每一列对应正则表达式中的一个捕获组。如果正则表达式不包含捕获组,或者expand=False,则会返回一个Series。

基本语法:

Series.str.extract(pat, flags=0, expand=True)
  • pat: 必需参数,表示用于提取的正则表达式模式。
  • flags: 可选参数,用于指定正则表达式的匹配标志(如re.IGNORECASE,需要导入re模块)。
  • expand: 布尔值,如果为True(默认值),则返回一个DataFrame;如果为False,则返回一个Series或DataFrame(取决于捕获组数量)。

3. 构建高效的正则表达式模式

本节将以从列中提取如"EE"、"AA"、"EA+"或"EA-"等特定代码为例,详细讲解如何构建正确的正则表达式。

3.1 识别目标模式

假设我们需要从字符串中识别以下几种模式:

  • EE
  • AA
  • EA+
  • EA-

3.2 错误模式分析与修正

初学者常犯的一个错误是尝试使用字符集[]来表示多个可选的完整字符串,例如[EA+,AA,EA-]。然而,在正则表达式中,[]表示匹配方括号内任意一个字符。因此,[EA+,AA,EA-]会匹配E、A、+、,、-中的任意一个字符,而不是我们期望的完整字符串模式。

要匹配多个完整的可选字符串模式,应该使用管道符 | 作为“或”运算符,并将每个模式用括号 () 括起来形成捕获组。

此外,+和-在正则表达式中是特殊字符(分别表示“一个或多个”和“范围”)。如果它们作为字面字符出现,需要使用反斜杠 \ 进行转义。或者,当它们出现在字符集 [] 内部时,通常不需要转义(除非在特定位置,如[+-]表示匹配+或-)。

3.3 正确的正则表达式构建

结合上述原则,我们可以构建出以下正则表达式:

  • 匹配 "EE"、"AA"、"EA+" 或 "EA-":
    (EE|AA|EA[+-])
    • EE: 匹配字面字符串 "EE"。
    • AA: 匹配字面字符串 "AA"。
    • EA[+-]: 匹配 "EA" 后跟一个 + 或 - 字符。[+-]是一个字符集,表示匹配字符 + 或 - 中的任意一个。

如果只需要匹配 EE 和 AA,则可以简化为:

(EE|AA)

4. 实际操作:在Pandas DataFrame中提取模式

下面通过一个具体的代码示例来演示如何应用这些正则表达式。

4.1 准备示例数据

首先,创建一个模拟原始Excel数据结构的DataFrame:

import pandas as pd
import numpy as np

# 模拟原始数据
data = {
    'Nachfolger': [
        '54;20', '----', '52;128AA;207;22;223', '----', '138EE;34',
        '----', '139EE;36', '----', '140EE;38', '----', '141EE;40',
        '21;4;49;50;51', '52', '52;24', '28', '52;227;27', '30',
        '227', '52;31', 'SampleEA+text', 'AnotherEA-item' # 添加包含EA+和EA-的示例
    ]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)

4.2 使用 str.extract() 提取模式

现在,我们使用前面构建的正则表达式来提取模式。

阿拉丁·Excel 图表生成器
阿拉丁·Excel 图表生成器

Excel 数据可视化图表生成器 - 把 Excel/表格数据一键转为柱状图、折线图、饼图、雷达图、堆叠柱状图、散点图、面积图、环形图、气泡图、极坐标图、水平柱状图、柱+线组合双轴图。支持数据透视后绘图(--pivot),输出交互式 HTML(可悬停查看数值、一键下载 PNG)与静态 PNG(可嵌入文档/PPT)。提供两套配色方案: cn-stock(涨红跌绿, 金融财报默认) 与 vibrant(明亮风格, 适合演示报告)。当用户提到数据可视化、画图、图表、走势图、占比图、趋势图、对比图、透视表、Exc

下载

示例一:提取 "EE" 或 "AA"

# 提取 'EE' 或 'AA'
df['Verknüpfung_EA_AA'] = df['Nachfolger'].str.extract(r'(EE|AA)', expand=True)
print("\n提取 'EE' 或 'AA' 后的DataFrame:")
print(df)

示例二:提取 "EE"、"AA"、"EA+" 或 "EA-"

为了更全面地覆盖可能的需求,我们使用包含 EA[+-] 的正则表达式。

# 提取 'EE', 'AA', 'EA+' 或 'EA-'
df['Verknüpfung_Full'] = df['Nachfolger'].str.extract(r'(EE|AA|EA[+-])', expand=True)
print("\n提取 'EE', 'AA', 'EA+' 或 'EA-' 后的DataFrame:")
print(df)

4.3 处理提取结果

str.extract()在没有匹配时会返回NaN。根据需求,我们可以选择填充这些NaN值(例如用0或空字符串),或者直接进行计数。

填充 NaN 值:

# 填充 NaN 值为 '0'
df['Verknüpfung_EA_AA'] = df['Verknüpfung_EA_AA'].fillna('0')
df['Verknüpfung_Full'] = df['Verknüpfung_Full'].fillna('0')
print("\n填充 NaN 后的DataFrame:")
print(df)

统计匹配项:

要统计每个模式的出现次数,可以使用value_counts()方法。

# 统计 'Verknüpfung_EA_AA' 列中非 '0' 模式的出现次数
print("\n'EE' 或 'AA' 模式的统计:")
print(df[df['Verknüpfung_EA_AA'] != '0']['Verknüpfung_EA_AA'].value_counts())

# 统计 'Verknüpfung_Full' 列中非 '0' 模式的出现次数
print("\n所有指定模式的统计:")
print(df[df['Verknüpfung_Full'] != '0']['Verknüpfung_Full'].value_counts())

5. 注意事项与进阶技巧

  • 捕获组与返回DataFrame的列: str.extract()返回的DataFrame列数与正则表达式中的捕获组数量一致。如果只有一个捕获组,返回的DataFrame将只有一列。

  • 非捕获组: 如果你只想使用括号进行分组而不希望其内容作为一个单独的列返回,可以使用非捕获组 (?:...)。例如 (?:EE|AA)。

  • str.contains(): 如果你只需要判断某个模式是否存在于字符串中,而不需要提取具体内容,可以使用df.str.contains(pat),它返回一个布尔Series。这在进行简单筛选或标记时非常有用。

  • 性能考量: 对于非常大的数据集,复杂的正则表达式可能会影响性能。在可能的情况下,尽量优化正则表达式或考虑其他字符串处理方法。

  • 多模式提取到不同列: 如果需要将不同的模式提取到不同的列中,可以为每个模式单独调用str.extract(),或者使用带有多个命名捕获组的正则表达式。

    # 示例:将EE和AA分别提取到不同列
    # 方法一:分别调用extract
    df['Verknüpfung_EE'] = df['Nachfolger'].str.extract(r'(EE)', expand=True).fillna('0')
    df['Verknüpfung_AA'] = df['Nachfolger'].str.extract(r'(AA)', expand=True).fillna('0')
    print("\nEE和AA分别提取到不同列的DataFrame (方法一):")
    print(df[['Nachfolger', 'Verknüpfung_EE', 'Verknüpfung_AA']])
    
    # 方法二:使用命名捕获组(如果模式不重叠,且想一次性提取)
    # 注意:如果同一行有多个匹配,只有第一个匹配会被提取到对应的命名组
    # 更常见且健壮的做法是分开提取,或使用更复杂的regex确保只捕获一次
    # 这里为了演示命名捕获组,我们假设模式是互斥的或者只关心第一个
    df_extracted = df['Nachfolger'].str.extract(r'(?P<EE_Val>EE)|(?P<AA_Val>AA)|(?P<EA_Val>EA[+-])', expand=True)
    df = pd.concat([df, df_extracted.fillna('0')], axis=1)
    print("\n使用命名捕获组提取到不同列的DataFrame (方法二):")
    print(df[['Nachfolger', 'EE_Val', 'AA_Val', 'EA_Val']])

6. 总结

通过本文的学习,我们掌握了如何利用Pandas的str.extract()方法结合正则表达式,从DataFrame的混合数据列中高效地提取特定模式。关键在于正确理解并构建正则表达式,尤其是使用管道符|来表示可选模式,以及处理特殊字符。掌握这些技巧,将极大地提升您在数据清洗和预处理方面的能力,使您能够更精确地从复杂数据中获取所需信息,为后续的数据分析工作奠定坚实基础。

热门AI工具

更多
小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4896

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

3361

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9362

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

832

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

520

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

693

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

406

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

739

2023.12.06

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 45.5万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn