Pandas DataFrame中基于字符串数字的高级条件赋值技巧

Pandas DataFrame中基于字符串数字的高级条件赋值技巧

本文深入探讨了在Pandas DataFrame中,如何根据现有列(如字符串中的数字部分)的特定条件,高效地创建或更新新列。文章将详细介绍如何结合str.extract、pd.cut和np.log10等工具,实现基于数值范围或数字位数的高级条件赋值,从而提升数据处理的灵活性和效率。

在数据分析和处理过程中,我们经常需要根据dataframe中某一列的复杂条件来生成或更新另一列的值。例如,从一个包含混合字符串和数字的列中提取数字,并根据这些数字的特点(如数值大小范围或数字的位数)进行分类赋值。本教程将展示两种高效且专业的pandas解决方案来解决这类问题。

初始数据准备

首先,我们构建一个示例DataFrame,它包含Server和Port两列。Port列是一个字符串,其中包含”Ethernet”前缀和随后的一个或多个数字。

import pandas as pdimport numpy as npdata = {    'Server': ['Ser123', 'Ser123', 'Ser123', 'Ser123', 'Serabc', 'Serabc', 'Serabc', 'Serabc'],    'Port': ['Ethernet3', 'Ethernet4', 'Ethernet12', 'Ethernet567', 'Ethernet2', 'Ethernet34', 'Ethernet458', 'Ethernet5689']}df = pd.DataFrame(data)print("原始DataFrame:")print(df)

输出:

原始DataFrame:   Server          Port0  Ser123     Ethernet31  Ser123     Ethernet42  Ser123    Ethernet123  Ser123   Ethernet5674  Serabc     Ethernet25  Serabc    Ethernet346  Serabc   Ethernet4587  Serabc  Ethernet5689

我们的目标是创建一个名为function_val的新列,其值将根据Port列中数字部分的特性来决定。具体规则如下:

如果数字是1位(例如Ethernet3),function_val为’5k’。如果数字是2位(例如Ethernet12),function_val为’10k’。如果数字是3位或更多(例如Ethernet567),function_val为’20k’。

解决方案一:基于数值范围的分类赋值 (str.extract + pd.cut)

这种方法适用于根据提取出的数字的数值大小范围进行分类。

提取数字: 使用Series.str.extract()结合正则表达式r'(d+)$’来提取Port列末尾的数字。(d+)捕获一个或多个数字,$匹配字符串的末尾。expand=False确保返回一个Series而不是DataFrame。类型转换: 将提取出的字符串数字转换为整数类型,以便进行数值比较。区间划分与赋值: 使用pd.cut()函数将数字划分到预定义的区间(bins)中,并为每个区间分配相应的标签(labels)。

# 定义数值区间和对应的标签bins = [0, 10, 100, np.inf] # 0 < x <= 10, 10 < x <= 100, 100 < x <= inflabels = ['5k', '10k', '20k']# 提取数字,转换为整数,并使用pd.cut进行分类赋值df['function_val_cut'] = pd.cut(    df['Port'].str.extract(r'(d+)$', expand=False).astype(int),    bins=bins,    labels=labels,    right=True # 默认右闭合,即 (bin_i, bin_i+1])print("n使用pd.cut分类后的DataFrame:")print(df)

输出:

使用pd.cut分类后的DataFrame:   Server          Port function_val_cut0  Ser123     Ethernet3               5k1  Ser123     Ethernet4               5k2  Ser123    Ethernet12              10k3  Ser123   Ethernet567              20k4  Serabc     Ethernet2               5k5  Serabc    Ethernet34              10k6  Serabc   Ethernet458              20k7  Serabc  Ethernet5689              NaN

注意事项:

bins定义了区间的边界。例如,[0, 10, 100, np.inf]会创建三个区间:(0, 10], (10, 100], (100, inf)。right=True(默认值)表示区间是右闭合的,即bins[i]到bins[i+1]的区间包含bins[i+1]但不包含bins[i]。在上述示例中,Ethernet5689中的5689超出了[0, 10, 100, np.inf]定义的最高区间,因此被赋值为NaN。如果需要处理这种情况,可以调整bins的定义或在pd.cut之后进行进一步处理。

解决方案二:基于数字位数的条件赋值 (str.extract + np.log10 + np.ceil + map)

这种方法适用于根据提取出的数字的位数进行分类。

提取数字和类型转换: 与方法一相同,提取数字并转换为整数。计算位数: 利用数学函数np.log10和np.ceil来计算一个正整数的位数。对于一个正整数N,其位数为ceil(log10(N+1))。例如,N=3 (log10(4) ≈ 0.6) -> ceil(0.6) = 1位。例如,N=12 (log10(13) ≈ 1.1) -> ceil(1.1) = 2位。例如,N=567 (log10(568) ≈ 2.7) -> ceil(2.7) = 3位。映射赋值: 使用Series.map()函数将计算出的位数映射到预定义的标签字典。

# 定义位数和对应的标签映射labels_by_digits = {1: '5k', 2: '10k', 3: '20k', 4: '20k'} # 假设4位也对应20k# 提取数字,转换为整数,计算位数,并使用map进行赋值df['function_val_digits'] = (    np.ceil(np.log10(df['Port'].str.extract(r'(d+)$', expand=False).astype(int) + 1))    .map(labels_by_digits))print("n使用位数映射分类后的DataFrame:")print(df)

输出:

使用位数映射分类后的DataFrame:   Server          Port function_val_cut function_val_digits0  Ser123     Ethernet3               5k                  5k1  Ser123     Ethernet4               5k                  5k2  Ser123    Ethernet12              10k                 10k3  Ser123   Ethernet567              20k                 20k4  Serabc     Ethernet2               5k                  5k5  Serabc    Ethernet34              10k                 10k6  Serabc   Ethernet458              20k                 20k7  Serabc  Ethernet5689              NaN                 20k

注意事项:

labels_by_digits字典需要包含所有可能出现的位数及其对应的标签。如果计算出的位数在字典中没有对应的键,map函数将返回NaN。这种方法对于严格按照数字位数进行分类的场景非常有效。

总结与最佳实践

本文展示了在Pandas DataFrame中根据复杂条件(特别是从字符串中提取数字并基于其数值或位数)创建新列的两种强大方法:

str.extract + pd.cut: 适用于根据数值的大小范围进行分类。当需要将连续的数值数据离散化到预定义区间时,这是一个理想的选择。str.extract + np.log10 + np.ceil + map: 适用于根据数字的位数进行分类。当分类逻辑与数字的长度而非具体数值范围更相关时,此方法更为直接和高效。

在实际应用中,选择哪种方法取决于具体的业务逻辑和分类需求。无论哪种方法,以下几点都是通用的最佳实践:

正则表达式的精准性: 确保str.extract中的正则表达式能够准确无误地捕获目标数据。数据类型转换: 在进行数值计算或比较之前,务必将提取出的字符串数据转换为正确的数值类型(如int或float)。错误处理: 考虑正则表达式未能匹配、类型转换失败或数值超出预设范围/映射字典的情况,并根据需要添加错误处理逻辑(例如,使用fillna()处理NaN值)。可读性与维护性: 对于复杂的条件逻辑,将bins、labels或映射字典定义为单独的变量,可以提高代码的可读性和可维护性。

通过掌握这些Pandas技巧,您可以更高效、更灵活地处理和转换DataFrame中的数据,满足各种复杂的数据处理需求。

以上就是Pandas DataFrame中基于字符串数字的高级条件赋值技巧的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python文件系统操作:利用os.scandir高效筛选目标子目录
上一篇 2025年12月14日 16:16:33
Python print()语句字符串与数字拼接错误解析与最佳实践
下一篇 2025年12月14日 16:16:40

相关推荐

  • VSCode如何实现代码热重载 VSCode实时预览开发的高效配置方案

    使用live server扩展实现静态文件的实时预览,保存后浏览器自动刷新;2. 利用现代前端框架(如react、vue)内置的开发服务器(如vite、webpack dev server)实现hmr热模块替换,修改代码后仅更新变动模块而不刷新页面;3. 结合browsersync等工具实现多设备同…

    2026年9月24日
    000
  • 外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀

    外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀

    来入手《消逝的光芒:困兽》吧!现享金币优惠叠加专属优惠券折上折,标准版仅需200.9元(共节省47.1元);豪华版233.2元(总计立减54.8元)。 由Techland打造的《消逝的光芒》系列新作《消逝的光芒:困兽》已正式上线。本作背景设定在曾经风景如画、如今却尸横遍野的河狸谷。玩家将在此组建临时…

    2026年9月24日 用户投稿
    000
  • UC浏览器怎么查看和清除LocalStorage数据 UC浏览器LocalStorage数据管理方法

    可通过隐私设置清除或开发者工具查看LocalStorage。①在UC浏览器设置中选择“隐私与安全”→“清除浏览数据”,勾选“Cookie及其他网站数据”即可批量删除LocalStorage;②打开uc://inspect启用开发者工具,通过电脑Chrome远程调试查看具体键值对;③root设备后使用…

    2026年9月24日
    200
  • Java语法基础中static关键字可以修饰哪些内容

    static关键字用于定义类成员,包括静态变量(如计数器)、静态方法(如工具方法)、静态代码块(类加载时执行)和静态内部类(不依赖外部类实例),均属于类而非对象,通过类名访问,提升成员至类级别实现共享与提前使用。 static 关键字在 Java 中主要用于定义与类相关而非与对象实例相关的成员。它不…

    2026年9月24日
    100
  • 抖音怎么看注册时间?怎么看百度网盘注册时间

    抖音已然成为国内炙手可热的短视频平台之一。凭借其独特的智能推荐系统,用户能够在短时间内找到自己喜爱的内容。你是否知道,你的抖音注册时间实际上隐含了许多关于你的社交轨迹的信息呢?本文将带领大家一同揭秘抖音注册时间背后的故事。 一、抖音注册时间的意义 1. 用户活跃程度的体现 抖音注册时间能够帮助我们判…

    2026年9月24日
    100
  • 为什么要4k对齐

    早期硬盘的每个扇区以512字节为标准,而新一代硬盘的扇区容量则为4096个字节,即所谓的4k扇区。虽然硬盘标准已经更新,但操作系统仍然使用512字节扇区的标准。为了确保兼容性,硬盘制造商将4k扇区模拟成了512字节扇区。文件系统的块(簇)通常是512字节的倍数,而新系统大多设定为4k的倍数,例如li…

    2026年9月24日
    000
  • 抖音怎么下载视频?抖音怎么提取别人的视频

    抖音作为一个热门的短视频社交平台,凭借其多样化的短视频内容吸引了众多用户。部分用户在浏览抖音视频时,希望能将其保存下来以供后续观看。那么,如何在抖音上下载视频呢?接下来,本文将详细介绍几种下载抖音视频的方法以及相关的注意事项。 一、抖音视频下载方法 使用抖音官方提供的下载功能 抖音自身具备下载功能,…

    2026年9月24日
    400
  • google浏览器怎么把网页保存为PDF_google浏览器网页保存为PDF方法

    使用Chrome将网页保存为PDF,首先按Ctrl+P进入打印界面,选择“另存为PDF”并调整设置后保存;也可通过F12打开开发者工具,截取指定元素或完整页面截图后转为PDF;还可安装“Save as PDF”等扩展程序实现更高质量的导出。 如果您希望将当前浏览的网页完整保存以便离线查看或分享,Go…

    2026年9月24日
    000
  • VSCode如何实现AI版本迁移辅助 VSCode跨版本升级的智能建议

    vscode的“ai版本迁移辅助”并非独立功能,而是通过扩展兼容性检查、设置同步、lsp/dap协议支持及社区资源等生态能力协同实现;2. 升级后扩展无法工作时,应检查更新日志、尝试降级或重新安装扩展、禁用冲突扩展、查看控制台错误信息并向作者报告问题;3. 备份设置和扩展列表可通过启用设置同步、手动…

    2026年9月24日
    1000
  • 抖音怎么投屏到电视上?抖音如何TV投屏

    智能电视已经成为了家庭娱乐的核心设备。在享受高清晰度大屏幕带来的视觉震撼的同时,抖音这款广受欢迎的短视频应用也吸引了众多用户。如何将抖音中的精彩内容传输到电视屏幕上,与家人和朋友一同分享呢?本文将详细介绍几种简单有效的方法,帮助您轻松实现抖音投屏到电视。 一、方法一:利用电视内置投屏功能 1. 内置…

    2026年9月24日
    000
  • uc浏览器如何清除指定的网站数据_UC浏览器定点清除网站Cookie与缓存

    可针对特定网站清理缓存或Cookie解决UC浏览器访问异常。1、进入设置→隐私与安全→管理网站数据,搜索目标网站并清除其数据;2、使用无痕浏览模式访问网站,避免数据残留;3、通过文件管理器手动删除UC浏览器缓存目录下对应域名的缓存文件夹。 如果您在使用UC浏览器访问某些网站时遇到加载异常、登录状态失…

    2026年9月24日
    000
  • MAC系统怎么开启防火墙_MAC开启防火墙教程

    1、建议在Mac系统中开启防火墙以提升网络安全,可通过“系统设置”中的“网络-防火墙”选项启用;2、高级用户可使用终端命令sudo /usr/libexec/ApplicationFirewall/socketfilterfw –setglobalstate on开启服务;3、启用后可在…

    2026年9月24日
    100
  • APM开发阅读

    APM开发阅读APM开发阅读APM开发阅读APM开发阅读

    我阅读apm的源码有两个主要目的:一是学习,了解飞控系统和大型项目的组织结构;二是为了移植的需要,满足项目需求。近年来,少儿编程市场非常火热,许多厂商推出了相关的产品,但这些产品大多使用空心杯电机,导致动力不足,且扩展性有限。许多任务需要io或图像识别的支持。 因此,我在考虑使用APM裁剪版的飞控系…

    2026年9月24日 用户投稿
    1600
  • MySQL中SQL注入防范 SQL注入攻击的预防与应对措施

    sql注入的防范核心在于参数化查询。具体措施包括:1.始终使用参数化查询,将用户输入视为数据而非可执行代码;2.对输入进行过滤与校验,如验证格式、转义特殊字符;3.遵循最小权限原则,限制数据库账号权限;4.控制错误信息输出,避免暴露敏感细节;5.定期更新框架与插件,及时修补漏洞。这些方法结合使用能有…

    2026年9月24日
    000
  • 如何在Linux中切换用户身份?

    Linux中切换用户主要用su和sudo命令;2. su切换用户需密码,su -可加载完整环境;3. sudo允许授权用户以root等身份执行命令而无需对方密码;4. 推荐使用sudo -i或sudo su -切换到root;5. 普通用户需加入sudo组或配置/etc/sudoers文件;6. 编…

    2026年9月24日
    100
  • VSCode的扩展设置是全局的还是局部的?

    VSCode扩展设置默认全局生效,存储于用户配置文件中,但部分扩展如ESLint、Prettier和Python支持项目级局部配置,通过在项目根目录的.vscode/settings.json文件中定义,可覆盖全局设置;在设置界面中,齿轮图标表示可被工作区覆盖,锁图标表示仅限全局修改,用户可根据需求…

    2026年9月24日
    200
  • PHP如何批量处理图片_PHP实现多张图片自动化处理

    批量处理图片时需循环读取并逐个处理,核心是使用scandir()获取文件列表,通过GD库或Imagick处理图像,每处理完一张用imagedestroy()释放内存以避免内存溢出;为提升效率可分批处理、优化算法、使用多进程或异步队列,并选用Intervention Image等高效第三方库。 批量处…

    2026年9月24日
    100
  • MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案

    MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案MySQL怎样处理SQL注入风险 参数化查询与特殊字符过滤方案

    参数化查询和特殊字符过滤是防止sql注入的有效方法。1. 参数化查询通过预处理语句将sql结构与数据分离,用户输入被视为参数,不会被解释为sql命令;2. 特殊字符过滤通过转义或拒绝单引号、双引号等危险字符来阻止攻击;3. 定期审查mysql安全配置,包括更新版本、限制权限、启用日志、使用防火墙和扫…

    2026年9月24日 用户投稿
    000
  • win8如何禁用usb端口_Win8 USB端口禁用教程

    1、通过组策略禁用USB存储:使用gpedit.msc进入可移动存储访问,启用“拒绝所有权限”并重启生效;2、修改注册表阻止驱动加载:将USBSTOR下的Start值设为4以禁用U盘等设备;3、设备管理器中手动禁用USB根集线器:逐一右键禁用各USB Root Hub实现端口封锁。 如果您希望在Wi…

    2026年9月24日
    300
  • 如何查找大文件 find命令按大小搜索技巧

    如何查找大文件 find命令按大小搜索技巧如何查找大文件 find命令按大小搜索技巧如何查找大文件 find命令按大小搜索技巧如何查找大文件 find命令按大小搜索技巧

    要在linux中查找大文件,首先使用find命令配合-size参数定位指定大小以上的文件,例如:find /path/to/search -type f -size +5m。其次结合-exec和du、sort等命令可对结果排序并显示详细信息。最后也可用du与sort组合快速列出最大文件,或安装ncd…

    2026年9月24日 用户投稿
    1600

发表回复

登录后才能评论
关注微信