Pandas DataFrame str.extract与loc赋值策略深度解析

pandas dataframe str.extract与loc赋值策略深度解析

本文深入探讨了在Pandas DataFrame中利用str.extract或str.split方法从字符串列中提取信息并赋值给新列或现有列的常见问题与解决方案。特别关注了在使用.loc进行条件性多列赋值时可能遇到的行为差异,提供了包括命名捕获组、to_numpy()转换以及str.split等多种专业且高效的实现策略,旨在帮助用户避免NaN赋值陷阱,优化数据处理流程。

1. 理解字符串提取与基本赋值

在数据分析中,我们经常需要从包含特定模式的字符串列中提取子串,并将其分离到不同的列中。Pandas提供了强大的str访问器,结合正则表达式(str.extract)或简单的分隔符(str.split)可以高效完成此任务。

假设我们有一个DataFrame df,其中包含一个名为 “Cypher” 的列,其值可能包含斜杠 /,例如 “d7/I” 或 “7/-“。我们的目标是将斜杠前后的部分分别提取到 “Cypher” 和 “Bass” 两列中。

首先,我们创建一个示例DataFrame:

import pandas as pdimport numpy as npdata = {    'Cypher': ['', '2', '43', '64', '65', 'j9', 'j43', 'j65', 'j2', '/I', '7',               '7/-', 'd6', 'ø7', 'ø2', 'd43', 'd64', 'd7', 'd7/I', 'ø65', 'ø7/I',               '6', 'j7', 'd7/-', 'ø7/-', 'd7/VI']}df = pd.DataFrame(data)print("原始DataFrame:")print(df.head(10))

对于包含斜杠的字符串,str.extract(‘(.*)/(.*)’) 可以有效提取出两部分:

extracted_data = df.Cypher.str.extract('(.*)/(.*)').dropna()print("n部分提取结果 (仅包含斜杠的行):")print(extracted_data)

如果我们将提取结果直接赋值给新的列,这是可行的:

df_copy = df.copy()df_copy[['Cyph', 'Bass']] = df_copy.Cypher.str.extract('(.*)/(.*)')print("n赋值给新列 'Cyph' 和 'Bass':")print(df_copy.head(15))

上述操作会将提取到的值放入 ‘Cyph’ 和 ‘Bass’ 列,对于不匹配正则表达式的行,则会填充 NaN,这符合预期。

2. loc 条件赋值的“异常”行为解析

问题出在尝试使用 .loc 进行条件性赋值,并且目标列中包含原列名时。例如,当试图将提取结果直接赋回 “Cypher” 列并创建 “Bass” 列时:

# 尝试失败的例子 (会产生NaN)# df.loc[df.Cypher.str.contains('/'), ['Cypher', 'Bass']] = df.Cypher.str.extract('(.*)/(.*)')

上述代码尝试对满足 df.Cypher.str.contains(‘/’) 条件的行,将其 “Cypher” 和 “Bass” 列更新为 str.extract 的结果。然而,执行后,这些行对应的 “Cypher” 和 “Bass” 列会意外地变为 NaN。

原因分析:df.Cypher.str.extract(‘(.*)/(.*)’) 的结果是一个新的 DataFrame,其列名默认是 0 和 1。当使用 .loc 进行多列赋值时,Pandas 会尝试根据列名进行对齐。由于源 DataFrame(str.extract 的结果)的列名 0, 1 与目标 DataFrame 的列名 Cypher, Bass 不匹配,Pandas 无法找到对应的列进行赋值,因此会用 NaN 填充。即使目标列中包含原列名,如果源 DataFrame的列名不对齐,也会出现问题。

3. 解决策略与专业实践

为了正确地实现条件性多列赋值,我们需要确保源数据与目标数据在结构和列名上能够正确匹配。以下是几种推荐的解决方案:

3.1 使用命名捕获组(Named Capture Groups)

通过在正则表达式中使用命名捕获组 (?P…),我们可以让 str.extract 返回的 DataFrame 拥有我们指定的列名。这样,在进行 .loc 赋值时,列名就能正确对齐。

df_named_groups = df.copy()mask = df_named_groups['Cypher'].str.contains('/')# 使用命名捕获组,确保str.extract的输出DataFrame有正确的列名extracted_df = df_named_groups['Cypher'].str.extract('(?P.*)/(?P.*)')df_named_groups.loc[mask, ['Cypher', 'Bass']] = extracted_df.loc[mask]print("n解决方案1: 使用命名捕获组")print(df_named_groups.head(15))

说明: (?P.*) 将匹配到的第一部分命名为 “Cypher” 列,(?P.*) 将第二部分命名为 “Bass” 列。这样,str.extract 返回的 DataFrame 就有了 ‘Cypher’ 和 ‘Bass’ 这两列,与 .loc 目标列名完全匹配,从而实现正确赋值。

3.2 转换为 NumPy 数组进行赋值

另一种方法是,在进行 .loc 赋值时,将 str.extract 的结果转换为 NumPy 数组。这样可以绕过列名对齐的机制,直接按位置进行赋值。

df_to_numpy = df.copy()mask = df_to_numpy['Cypher'].str.contains('/')# 提取数据,并转换为NumPy数组extracted_array = df_to_numpy.loc[mask, 'Cypher'].str.extract('(.*)/(.*)').to_numpy()df_to_numpy.loc[mask, ['Cypher', 'Bass']] = extracted_arrayprint("n解决方案2: 转换为NumPy数组")print(df_to_numpy.head(15))

说明: to_numpy() 将 str.extract 返回的 DataFrame 转换为一个二维 NumPy 数组。当对 DataFrame 的多列进行赋值时,如果右侧是一个 NumPy 数组,Pandas 会按位置将数组的列与目标列进行匹配。

3.3 简化正则,一次性处理所有情况

如果我们希望一次性处理所有行,无论是否包含斜杠,并且将结果分别放入 “Cypher” 和 “Bass” 列,可以使用更灵活的正则表达式。

df_simplified_regex = df.copy()# 使用非捕获组 (?:...) 和可选匹配 ?# (?:/(.*))? 表示斜杠及后面的内容是可选的df_simplified_regex[['Cypher', 'Bass']] = df_simplified_regex['Cypher'].str.extract('([^/]*)(?:/(.*))?')print("n解决方案3: 简化正则,一次性处理所有行")print(df_simplified_regex.head(15))

说明: ([^/]*) 捕获所有非斜杠字符作为 “Cypher” 部分。(?:/(.*))? 是一个非捕获组,表示斜杠 / 及其后面的任意字符 (.*) 都是可选的。如果存在斜杠,后面的内容会被捕获到 “Bass” 列;如果不存在,”Bass” 列将为 NaN。这种方法避免了条件筛选,直接作用于整个 DataFrame。

3.4 使用 str.split 进行分离

对于简单的分隔符(如斜杠 /),str.split 往往是更简洁、更直观的选择。它也可以直接展开为多列。

df_split = df.copy()# 使用str.split并expand=True直接创建多列df_split[['Cypher', 'Bass']] = df_split['Cypher'].str.split('/', expand=True)print("n解决方案4: 使用str.split")print(df_split.head(15))

说明: str.split(‘/’, expand=True) 会将 “Cypher” 列的字符串按 / 分割,并将结果展开成新的两列。如果字符串不包含 /,第二列将填充 NaN。这种方法通常比正则表达式更易读,且性能也很好。

4. 总结与注意事项

在Pandas中进行字符串提取和多列赋值时,理解Pandas如何处理DataFrame之间的列对齐至关重要。

列名匹配是关键: 当源DataFrame(如 str.extract 的结果)与目标DataFrame(.loc 赋值的左侧)的列名不匹配时,Pandas会用 NaN 填充无法对齐的列。命名捕获组 (?P…) 是解决 str.extract 列名对齐问题的优雅方式,它直接为提取结果赋予目标列名。to_numpy() 提供了一种强制按位置赋值的方法,绕过了列名对齐机制,适用于源DataFrame没有合适列名的情况。str.split(…, expand=True) 是处理简单分隔符场景的最佳实践,它简洁高效,并且能够直接生成多列。选择合适的工具: 对于复杂的模式匹配,str.extract 是首选;对于简单的分隔符,str.split 更为直观和高效。

通过掌握这些策略,您可以更有效地在Pandas中进行字符串数据清洗和重构,避免常见的赋值陷阱,确保数据处理的准确性和可靠性。

以上就是Pandas DataFrame str.extract与loc赋值策略深度解析的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
解决Numpy数组插入的常见陷阱:理解np.insert的非原地操作与数据复制
上一篇 2025年12月14日 15:11:35
解决Python读取JSON文件数据不一致问题:路径管理与最佳实践
下一篇 2025年12月14日 15:11:40

相关推荐

  • win8资源管理器停止工作_Win8资源管理器故障修复

    win8资源管理器停止工作_Win8资源管理器故障修复win8资源管理器停止工作_Win8资源管理器故障修复win8资源管理器停止工作_Win8资源管理器故障修复win8资源管理器停止工作_Win8资源管理器故障修复

    首先重启Windows资源管理器进程,若无效则通过SFC和DISM命令修复系统文件,接着更新显卡驱动,禁用第三方外壳扩展,并修改注册表启用独立进程运行文件夹窗口,以解决资源管理器无响应或频繁崩溃问题。 如果您在使用Windows 8系统时,遇到资源管理器无响应或频繁崩溃的情况,这将导致桌面和任务栏消…

    2026年9月28日 • 用户投稿
    100
  • 1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网

    1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网

    9月25日,在雷军2025年度演讲暨小米新品发布会上,小米正式推出sound 2 max蓝牙音箱,售价定为1999元。 该音箱采用经典的包豪斯设计语言,整体机身呈现纯净白色,外观简约大气,结构上运用一体式压铸工艺打造,坚固且富有现代美感。用户还可根据喜好更换三种不同材质的磁吸面板,实现个性化搭配。 …

    2026年9月28日 • 用户投稿
    100
  • Android应用开发:使用Intent实现页面跳转

    Android应用开发:使用Intent实现页面跳转Android应用开发:使用Intent实现页面跳转Android应用开发:使用Intent实现页面跳转Android应用开发:使用Intent实现页面跳转

    本文将介绍如何在Android应用中实现页面之间的跳转。通过使用Intent,我们可以轻松地从一个Activity切换到另一个Activity。本文将提供示例代码和详细步骤,帮助你理解Intent的基本用法,并掌握在按钮点击事件中启动新Activity的方法。 在Android应用开发中,页面跳转是…

    2026年9月28日 • 用户投稿
    000
  • 格子达论文查重怎么操作_格子达官方检测系统指南

    格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南

    首先登录格子达官网注册账号并登录,接着在个人中心上传符合格式的论文文件,填写必要信息后提交检测,最后等待系统生成报告并下载查看总相似比、AI占比等数据,结合标注内容进行修改。 格子达论文查重怎么操作?这是不少网友都关注的,接下来由PHP小编为大家带来格子达官方检测系统指南,感兴趣的网友一起随小编来瞧…

    2026年9月28日 • 用户投稿
    000
  • Android 应用中页面(Activity)间导航的实现指南

    Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南

    本文详细介绍了在 Android 应用中如何通过按钮实现不同页面(Activity)之间的切换。核心机制是使用 Intent 对象来指定目标 Activity,并通过 startActivity() 方法启动它。文章提供了 MainActivity.java 中的示例代码,并强调了 AndroidM…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    在Sublime Text中替换换行需启用正则模式,用n或R表示换行符。开启”.*”按钮后,查找用n、rn或R匹配不同换行格式,替换时用n插入换行,如将逗号替换为n可实现分行效果。 在Sublime Text中进行查找替换时,如果需要使用换行符,可以通过正则表达式模式来实现。…

    2026年9月28日 • 用户投稿
    100
  • 运维新概念:高效积累之道

    运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道

    当前技术更新日新月异,各类语言、工具和理念层出不穷,令人应接不暇。唯有持续学习、不断吸收新知,方能紧跟发展潮流,不被时代淘汰。 1、 IT部门面临诸多挑战 2、 目前,IT部门整体尚未获得充分认可。尽管信息化在各单位日益重要,仍有部分管理者将其视为单纯的成本支出部门,认为其只消耗资源而无法直接创收,…

    2026年9月28日 • 用户投稿
    100
  • 如何下载豆包AI应用 豆包AI应用下载与安装步骤解析

    如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析

    豆包ai应用下载安装方法有三种: 一、手机应用商店搜索“豆包”或“Doubao”,确认开发者为“北京字节跳动科技有限公司”后点击安装; 二、直接使用“豆包AI网页版在线使用入口☜☜☜☜直接进入”; 三、注意常见问题如无法找到应用时检查关键词、安装失败时查看存储和系统版本、iOS用户提示“未受信任的企…

    2026年9月28日 • 用户投稿
    000
  • sublime prettier插件配置_Prettier代码格式化插件配置指南

    sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南

    首先安装JsPrettier插件并配置prettier_cli_path和node_path路径,设置format_on_save_enabled为true以实现保存时自动格式化,确保prettier_options与项目规则一致,推荐在项目中本地安装Prettier并通过快捷键Ctrl+Alt+F…

    2026年9月28日 • 用户投稿
    000
  • 将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南

    将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南

    本文旨在指导开发者如何将PostgreSQL存储过程转换为Spring Boot应用中的原生SQL查询。通过分析一个具体的存储过程,我们将详细演示如何构建等效的SQL查询,并介绍Spring Data JPA @Query注解中两种主要的参数映射方式:命名参数和位置参数,以实现存储过程的替代。 存储…

    2026年9月28日 • 用户投稿
    100
  • 微信视频号有浏览足迹吗?视频号会有访客记录吗

    微信视频号有浏览足迹吗?视频号会有访客记录吗微信视频号有浏览足迹吗?视频号会有访客记录吗微信视频号有浏览足迹吗?视频号会有访客记录吗微信视频号有浏览足迹吗?视频号会有访客记录吗

    在移动互联网高速发展的今天,微信早已深度融入我们的日常生活。作为微信生态的重要组成部分,微信视频号吸引了大量用户驻足观看、创作和互动。你是否也曾有过这样的疑问:我在视频号上看过的视频会留下痕迹吗?别人能不能看到我的浏览记录?本文将为你全面解析——微信视频号是否有浏览足迹,以及是否存在访客记录。 一、…

    2026年9月28日 • 用户投稿
    100
  • sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本

    sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本

    下载Sublime Text便携版.zip并解压;2. 在解压目录创建Data文件夹;3. 启动sublime_text.exe即进入便携模式,所有配置自动存于Data内;4. 通过复制Data文件夹可实现设置备份与迁移,无需安装或注册表修改,跨设备使用便捷。 Sublime Text 本身不提供官…

    2026年9月28日 • 用户投稿
    000
  • 没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测

    没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测

    英雄游戏旗下潘神工作室于8月26日发布消息,其自主研发的免费arpg《二重螺旋》将于10月28日正式上线,登陆pc(epic games商店)、ios及android三大平台。游戏将取消角色与武器的抽卡机制,并彻底移除体力系统。 本作构建在一个魔法与机械交融的世界观中,人类与亚人种共同生活,但拥有双…

    2026年9月28日 • 用户投稿
    000
  • Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?

    Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?

    easynvr分为硬件版本和软件版本,两者的功能基本一致。然而,硬件版本的配置需要额外进行探索和接入步骤才能完成部署。探索功能需要使用tsingsee青犀视频自主研发的easysearcher探测工具,该工具可以在easynvr的官方网站上下载。 在某些情况下,EasySearcher探测工具可能会…

    2026年9月28日 • 用户投稿
    100
  • MySQL怎样使用索引合并优化 复合索引与索引合并策略

    MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略

    索引合并是mysql中一种优化策略,允许在单个查询中使用多个索引来定位数据。其主要类型包括:1. union合并,用于or连接的条件;2. intersection合并,用于and连接的条件;3. sort-union合并,用于需排序后再合并的情况。复合索引与索引合并不同,前者是多列组合索引,后者则…

    2026年9月28日 • 用户投稿
    000
  • 乌鲁木齐银行定向采购 Oracle、IBM、Redhat

    2022年2月18日,乌鲁木齐银行发布《正版oracle软件采购项目》公开询价公告,控制价 283 万元。 采购内容:主要目标为以数量授权模式采购,采购Oracle数据库6C,Oracle weblogic 4C,Oracle集群2C,Oracle ADG 2C。 2022年3月1日发布成交公告,新…

    2026年9月28日
    000
  • 抖音价格保护是什么意思?抖音有价格保护吗

    抖音价格保护是什么意思?抖音有价格保护吗抖音价格保护是什么意思?抖音有价格保护吗抖音价格保护是什么意思?抖音有价格保护吗抖音价格保护是什么意思?抖音有价格保护吗

    随着短视频平台的迅猛发展,抖音早已不只是一个娱乐工具,更成为集内容与电商于一体的综合性平台。越来越多用户选择在抖音购物,但随之而来的问题也引发了关注:刚买完商品会不会马上降价?有没有价格保障机制?今天我们就来深入解析“抖音是否有价格保护”以及“价格保护到底意味着什么”。 一、什么是抖音的价格保护? …

    2026年9月28日 • 用户投稿
    000
  • MBTI测试免费链接入口_ MBTI免费测试网站在线地址

    MBTI测试免费链接入口_ MBTI免费测试网站在线地址MBTI测试免费链接入口_ MBTI免费测试网站在线地址MBTI测试免费链接入口_ MBTI免费测试网站在线地址MBTI测试免费链接入口_ MBTI免费测试网站在线地址

    MBTI测试免费链接入口包括www.16personalities.com和www.16mbti.cn,前者基于荣格理论提供16种人格类型分析,含职业建议;后者支持多次测试、生成多维度报告,具社交分享功能,界面简洁适配多设备,测试约12分钟完成。 MBTI测试免费链接入口在哪里?这是不少网友都关注的…

    2026年9月28日 • 用户投稿
    000
  • 深入理解Java泛型:类型参数与方法重载的实践指南

    深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南

    本文深入探讨了Java泛型中关于类型参数与泛型类实例在方法签名中的区别,以及由此引发的类型不匹配问题。通过一个具体的代码示例,详细解析了为何在泛型方法中,直接传入泛型类实例或其内部类型参数会引发编译错误,并提供了利用方法重载这一核心机制来优雅地解决此类问题的专业指导和示例代码,帮助开发者清晰理解“h…

    2026年9月28日 • 用户投稿
    100
  • 抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息

    抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息

    随着抖音的普及,越来越多用户加入这个短视频社交平台。在日常使用中,不少人会收到陌生或不想要的私信,甚至遭遇骚扰信息。为了更好地保护个人隐私和使用体验,掌握屏蔽私信的方法显得尤为重要。接下来,就为大家详细介绍如何有效屏蔽抖音私信。 一、屏蔽抖音私信的具体操作 1. 屏蔽某个特定用户 当你希望阻止某位用…

    2026年9月28日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信