如何用更 Pythonic 的方式清洗字符串以生成规范列名
发布时间 - 2026-01-07 00:00:00 点击率:次本文介绍一种比链式 replace 更简洁、可读性更强的字符串清洗方法,利用 str 分割、后缀移除和 walrus 运算符等现代 python 特性,将嵌套标记字符串(如 "estimate!!total:!!male:!!5 to 9 years")高效转换为下划线分隔的标准化列名(如 "male_5_to_9")。
在数据预处理中,尤其面对美国 Census 等机构提供的多层嵌套标签(如 "Estimate!!Total:!!Male:!!5 to 9 years"),使用一长串 .str.replace() 不仅冗余难维护,还容易因顺序或遗漏导致逻辑错误。更 Pythonic 的解法是:以语义为单位拆解结构,再按规则重组。
核心思路如下:
- !! 是层级分隔符,取最后一段(即最细粒度标签)作为主体;
- 若该段以 "years" 结尾,需移除并标准化空格为下划线;
- 若不含 "years"(如 "Male:"),则仅清理冒号并保留主干;
- 统一用 _ 替代空格,避免末尾冗余下划线。
以下为推荐实现(兼容 pandas Series 和单个字符串):
import pandas as pd
def clean_label(s):
# 提取 !! 分隔后的最后一部分(如 "5 to 9 years" 或 "Male:")
tail = s.rpartition('!!')[-1]
# 移除末尾的 'years'(若存在),再按空格分割、下划线连接
if tail.endswith('years'):
cleaned = '_'.join(tail.removesuffix('years').split())
else:
# 移除末尾冒号,再处理空格(如 "Male:" → "Male")
cleaned = tail.rstrip(':').replace(' ', '_')
return cleaned
# 应用于 pandas Series(推荐)
df = pd.DataFrame({'LABEL': [
'Estimate!!Total:',
'Estimate!!Total:!!Male:',
'Estimate!!Total:!!Male:!!Under 5 years',
'Estimate!!Total:!!Male:!!5 to 9 years',
'Estimate!!Total:!!Male:!!10 to 14 years',
'Estimate!!Total:!!Male:!!15 to 17 years'
]})
df['clean_name'] = df['LABEL'].apply(clean_label)
print(df[['LABEL', 'clean_name']])输出:
LABEL clean_name 0 Estimate!!Total: Total 1 Estimate!!Total:!!Male: Male 2 Estimate!!Total:!!Male:!!Under 5 years Under_5 3 Estimate!!Total:!!Male:!!5 to 9 years 5_to_9 4 Estimate!!Total:!!Male:!!10 to 14 years 10_to_14 5 Estimate!!Total:!!Male:!!15 to 17 years 15_to_17
⚠️ 注意事项:
- rpartition('!!')[-1] 比 split('!!')[-1] 更安全:即使字符串不含 !!,也会返回原串(而非索引错误);
- removesuffix()(Python 3.9+)比 rstrip('years') 更精准(后者会误删 "yearsssss" 中的多个 's');若需兼容 Python ail[:-5] if tail.endswith('years') else tail;
- 对于含 : 的前缀(如 "Male:"),使用 rstrip(':') 而非 replace(':', ''),避免误删中间冒号(如 "10:15");
- 如需保留 "Total" 前缀(如示例
期望 "Male_Under_5"),可在 clean_label 中扩展逻辑:提取倒数第二段(如 "Male"),拼接时组合为 f"{parent}_{cleaned}"。
总结:告别“replace 链条”,拥抱语义化清洗——通过 rpartition 定位关键片段、removesuffix 精准裁剪、split() + '_' 连接完成标准化,代码更短、意图更明、健壮性更高。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速生成橙子建站落地页链接?
java获取注册ip实例
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
如何快速生成ASP一键建站模板并优化安全性?
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
如何在建站之星网店版论坛获取技术支持?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
实例解析Array和String方法
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
如何在宝塔面板中创建新站点?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
jQuery 常见小例汇总
Linux系统命令中tree命令详解
个人网站制作流程图片大全,个人网站如何注销?
JavaScript实现Fly Bird小游戏
浅谈redis在项目中的应用
Laravel如何为API生成Swagger或OpenAPI文档
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
PythonWeb开发入门教程_Flask快速构建Web应用
*服务器网站为何频现安全漏洞?
利用python获取某年中每个月的第一天和最后一天
简单实现jsp分页
JS碰撞运动实现方法详解
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
打造顶配客厅影院,这份100寸电视推荐名单请查收
浅析上传头像示例及其注意事项
LinuxCD持续部署教程_自动发布与回滚机制
Laravel如何使用Livewire构建动态组件?(入门代码)
如何用免费手机建站系统零基础打造专业网站?
Python并发异常传播_错误处理解析【教程】
百度浏览器如何管理插件 百度浏览器插件管理方法
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
LinuxShell函数封装方法_脚本复用设计思路【教程】
魔毅自助建站系统:模板定制与SEO优化一键生成指南
微信小程序 配置文件详细介绍
linux top下的 minerd 木马清除方法
Laravel如何使用模型观察者?(Observer代码示例)
如何在搬瓦工VPS快速搭建网站?
如何为不同团队 ID 动态生成多个非值班状态按钮
黑客如何通过漏洞一步步攻陷网站服务器?
Laravel如何创建自定义Facades?(详细步骤)
javascript日期怎么处理_如何格式化输出
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
魔方云NAT建站如何实现端口转发?
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信


期望 "Male_Under_5"),可在 clean_label 中扩展逻辑:提取倒数第二段(如 "Male"),拼接时组合为 f"{parent}_{cleaned}"。