当前位置:

首页 > 编程开发 > Pandas列拆分方法:按分隔符和大小写提取数据

Pandas列拆分方法:按分隔符和大小写提取数据

本文详细介绍了如何在PandasDataFrame中高效地拆分字符串列,特别是当拆分条件涉及特定分隔符(如"-")且分隔符后紧跟全大写字符时。通过使用正则表达式与Pandas的str.extract方法,我们能以矢量化方式精确地将一列数据拆分为两列,从而避免低效的行级操作,提升数据处理效率。

本文目录

    Pandas列拆分技巧:按特定分隔符和大小写规则提取数据

    本文详细介绍了如何在Pandas DataFrame中高效地拆分字符串列,特别是当拆分条件涉及特定分隔符(如" - ")且分隔符后紧跟全大写字符时。通过使用正则表达式与Pandas的str.extract方法,我们能以矢量化方式精确地将一列数据拆分为两列,从而避免低效的行级操作,提升数据处理效率。

    1. 问题背景与目标

    在数据清洗和预处理过程中,我们经常需要将包含复合信息的单列字符串拆分成多列,以便于后续分析。一个常见的挑战是,拆分点并非简单的固定字符,而是需要结合模式匹配,例如“在最后一个特定分隔符之后,如果跟随的是全大写字母或特定组合,则进行拆分”。本教程旨在解决这类问题,目标是将形如'Juan-Diva - HOLLS'的字符串拆分为'Juan-Diva'和'HOLLS'两部分,其中“HOLLS”必须是全大写。

    我们以以下DataFrame为例:

    import pandas as pd
    
    df = pd.DataFrame({
       'Value': [
            'Juan-Diva - HOLLS',
            'Carlos - George - ESTE BAN',
            'Javier Plain - Hotham Ham - ALPINE',
            'Yul - KONJ KOL MON'],
       })
    
    print("原始DataFrame:")
    print(df)

    预期输出结果如下:

                           First            Last
    0                  Juan-Diva           HOLLS
    1            Carlos - George      ESTE BAN
    2  Javier Plain - Hotham Ham        ALPINE
    3                        Yul    KONJ KOL MON

    2. 使用Pandas矢量化字符串操作 (str.extract)

    Pandas提供了强大的矢量化字符串方法,结合正则表达式可以高效地处理这类复杂拆分任务。str.extract()方法尤其适用于从字符串中提取符合特定模式的多个组。

    2.1 核心正则表达式解析

    要实现上述拆分,我们需要一个能够精确匹配“任意内容”后跟“ - ”,再后跟“全大写字母、空格或连字符的组合”直到字符串末尾的正则表达式。

    使用的正则表达式为:r'^(.*?) - ([A-Z\s-]+)$'

    我们来详细解析这个模式:

    • ^: 匹配字符串的开头。
    • (.*?): 这是第一个捕获组。
      • .: 匹配任何字符(除了换行符)。
      • *: 匹配前面的字符零次或多次。
      • ?: 使*变为非贪婪匹配。这意味着它会尽可能少地匹配字符,直到遇到下一个模式。在这里,它会匹配到最后一个' - '之前的所有内容,因为后面的模式是贪婪的。
    • -: 匹配字面字符串' - '(注意空格)。这是我们期望的拆分点。
    • ([A-Z\s-]+): 这是第二个捕获组,用于匹配字符串的“Last”部分。
      • [A-Z\s-]: 字符集,匹配任何大写字母(A-Z)、任何空白字符(\s,包括空格、制表符等)或连字符(-)。
      • +: 匹配前面的字符集一次或多次。
    • $: 匹配字符串的结尾。

    结合起来,这个正则表达式会从字符串开头非贪婪地捕获第一部分,然后寻找最后一个' - ',接着贪婪地捕获由大写字母、空格或连字符组成的第二部分直到字符串结束。

    2.2 示例代码

    import pandas as pd
    
    df = pd.DataFrame({
       'Value': [
            'Juan-Diva - HOLLS',
            'Carlos - George - ESTE BAN',
            'Javier Plain - Hotham Ham - ALPINE',
            'Yul - KONJ KOL MON'],
       })
    
    # 正则表达式模式
    pattern = r'^(.*?) - ([A-Z\s-]+)$'
    
    # 使用 .str.extract() 提取匹配组到新列
    df[['First', 'Last']] = df['Value'].str.extract(pattern)
    
    print("\n使用 .str.extract() 拆分后的DataFrame:")
    print(df)

    输出结果:

                                    Value                      First          Last
    0                   Juan-Diva - HOLLS                  Juan-Diva         HOLLS
    1          Carlos - George - ESTE BAN            Carlos - George      ESTE BAN
    2  Javier Plain - Hotham Ham - ALPINE  Javier Plain - Hotham Ham        ALPINE
    3                  Yul - KONJ KOL MON                        Yul  KONJ KOL MON

    这种方法利用了Pandas的底层优化,对整个Series进行矢量化操作,因此在处理大量数据时效率极高。

    3. 使用Python re 模块与 apply 方法

    虽然str.extract是首选的矢量化方法,但在某些复杂场景下,或者为了更灵活地处理匹配失败的情况,也可以结合Python的内置re模块和apply()方法。然而,需要注意的是,apply()是行级操作,通常不如矢量化操作高效。

    3.1 封装拆分逻辑为函数

    我们可以创建一个辅助函数来封装正则表达式匹配和结果提取的逻辑。

    import pandas as pd
    import re
    
    df = pd.DataFrame({
        'Value': [
            'Juan-Diva - HOLLS',
            'Carlos - George - ESTE BAN',
            'Javier Plain - Hotham Ham - ALPINE',
            'Yul - KONJ KOL MON'],
    })
    
    # 定义一个函数来处理每个字符串
    def split_value(s):
        # 正则表达式模式与上面相同
        pattern = r'^(.*?) - ([A-Z\s-]+)$'
        match = re.search(pattern, s)
        if match:
            return match.group(1), match.group(2)
        else:
            # 如果没有匹配,可以返回原始字符串和None,或根据需求返回其他默认值
            return s, None
    
    # 将函数应用到 'Value' 列
    # .apply() 返回一个Series,其中每个元素是 (First, Last) 元组
    # .tolist() 将Series转换为列表,其中每个元素是元组
    # 然后直接赋值给新的两列
    df[['First', 'Last']] = df['Value'].apply(lambda x: split_value(x)).tolist()
    
    print("\n使用 re 模块和 .apply() 拆分后的DataFrame:")
    print(df)

    输出结果:

                                    Value                      First          Last
    0                   Juan-Diva - HOLLS                  Juan-Diva         HOLLS
    1          Carlos - George - ESTE BAN            Carlos - George      ESTE BAN
    2  Javier Plain - Hotham Ham - ALPINE  Javier Plain - Hotham Ham        ALPINE
    3                  Yul - KONJ KOL MON                        Yul  KONJ KOL MON

    这种方法虽然功能上等效,但由于apply()是逐行执行Python函数,其性能通常不如Pandas的内置矢量化方法(如str.extract),尤其是在处理大型数据集时。

    4. 注意事项与性能考量

    • 矢量化操作优先: 在Pandas中进行字符串处理时,应优先考虑使用Series.str访问器提供的方法(如str.extract, str.split, str.contains等),因为它们是基于C语言实现的,经过高度优化,性能远超使用apply()结合Python原生re模块的行级操作。
    • 正则表达式的精确性: 正则表达式的设计是解决这类问题的关键。一个精确的正则表达式可以避免不必要的匹配错误,并确保数据按预期拆分。理解贪婪与非贪婪匹配(* vs *?)对于控制匹配范围至关重要。
    • 处理非匹配情况: str.extract()在没有匹配到模式时,会为相应的列填充NaN。如果使用apply()方法,可以在函数内部自定义处理非匹配情况的逻辑,例如返回默认值或原始字符串。
    • 数据量: 对于几百行甚至几千行的小型数据集,apply()方法的性能开销可能不明显。但当数据量达到数十万甚至数百万行时,矢量化操作的优势会非常显著。

    5. 总结

    本教程详细展示了如何在Pandas中根据复杂的模式拆分字符串列。通过利用正则表达式和Pandas的str.extract()矢量化方法,我们可以高效、精确地完成任务。对于大多数场景,推荐使用str.extract()以获得最佳性能。理解正则表达式的构建原理,特别是贪婪与非贪婪匹配,是成功解决此类数据处理挑战的关键。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    GitHub六个AI开源项目能做什么?软件理解、语音与求职场景
    GitHub六个AI开源项目能做什么?软件理解、语音与求职场景

    解析六个GitHub AI开源项目的具体用途,包括软件静态分析、智能体回答检查、多语言配音、求职材料生成、本地代码检索及动态歌词展示,帮助开发者根据实际需求筛选工具并正确验证结果。

    opencode安装skills教程及本地配置方法
    opencode安装skills教程及本地配置方法

    遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。

    如何开启Visual Studio2022实时代码分析警告提示
    如何开启Visual Studio2022实时代码分析警告提示

    解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

    如何在Visual Studio2022查看变量监视窗口调试程序
    如何在Visual Studio2022查看变量监视窗口调试程序

    详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

    Visual Studio2017设置默认编码为UTF-8不带BOM
    Visual Studio2017设置默认编码为UTF-8不带BOM

    针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。

    Visual Studio2022F5调试提示启动项目未配置怎么修复
    Visual Studio2022F5调试提示启动项目未配置怎么修复

    解决 Visual Studio 2022 F5 调试报错问题,通过设置启动项目、检查解决方案属性及正确区分类库与应用项目,快速恢复调试功能。

    Visual Studio2022NuGet包还原失败离线处理方案
    Visual Studio2022NuGet包还原失败离线处理方案

    解决Visual Studio 2022离线环境中NuGet包还原失败的难题,涵盖依赖链分析、本地源配置、包集收集及隔离验证步骤,帮助开发者构建稳定的离线开发环境。

    Visual Studio2017大项目加载缓慢,优化加载性能技巧
    Visual Studio2017大项目加载缓慢,优化加载性能技巧

    解决Visual Studio 2017大型项目加载慢的实用指南。涵盖性能监测、扩展管理、文档恢复优化及版本兼容性检查,帮助开发者精准定位瓶颈并提升工作效率。

    Visual Studio2022设置多启动项目同时调试运行
    Visual Studio2022设置多启动项目同时调试运行

    详解 Visual Studio 2022 多启动项目配置方法,包括启动动作选择、顺序调整及调试技巧,帮助开发者高效调试分布式或前后端分离应用。

    fastapi下载文件接口实现教程
    fastapi下载文件接口实现教程

    深入解析在FastAPI框架中实现文件下载接口的完整方案,涵盖基于FileResponse的本地静态文件传输、基于StreamingResponse的分块流式传输、RFC 5987中文文件名编码规范、路径穿越安全防御及BackgroundTasks临时文件清理,并配备详细代码示例与架构解析图。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。