0

0

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

碧海醫心

碧海醫心

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

|

701人浏览过

|

来源于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() 提取模式

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

百度智能云·曦灵
百度智能云·曦灵

百度旗下的AI数字人平台

下载

示例一:提取 "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'(?PEE)|(?PAA)|(?PEA[+-])', 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的混合数据列中高效地提取特定模式。关键在于正确理解并构建正则表达式,尤其是使用管道符|来表示可选模式,以及处理特殊字符。掌握这些技巧,将极大地提升您在数据清洗和预处理方面的能力,使您能够更精确地从复杂数据中获取所需信息,为后续的数据分析工作奠定坚实基础。

相关专题

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

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

510

2023.06.20

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

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

247

2023.07.05

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

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

737

2023.07.05

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

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

211

2023.08.11

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

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

349

2023.08.31

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

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

293

2023.11.13

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

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

232

2023.11.17

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

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

528

2023.12.06

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

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

精品课程

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

共162课时 | 11.8万人学习

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

共28课时 | 2.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号