本文介绍如何在pandas中安全地对含空格分隔的分数字符串(如 `'20 m b'` 或 `'25'`)进行分割,并稳定提取数字主值与可选备注字段,避免因字段缺失导致的 `keyerror` 或 `valueerror`。
在数据清洗中,常需将逗号分隔的字符串列(如 'score': '20 M B, 25, 21')展开为多行,并进一步拆分出核心数值与附加标记(如 'M B')。直接使用 str.split(' ', 1, expand=True)[1] 提取第二字段虽简洁,但当某行无空格(如 '25')时,expand=True 返回单列 DataFrame,索引 1 不存在,引发 KeyError: 1 —— 这是生产环境中典型的“隐性崩溃点”。
推荐方案一:reindex() 保障列结构稳定
通过 reindex(columns=[0, 1]) 显式声明所需列,缺失列自动填充为 NaN,彻底规避索引越界:
# 步骤1:按逗号分割并展开
df['score'] = df['score'].str.split(', ')
df = df.explode('score').reset_index(drop=True)
# 步骤2:安全分割空格,强制保留两列(score + note)
split_parts = df['score'].str.split(' ', n=1, expand=True).reindex(columns=[0, 1])
df[['score', 'note']] = split_parts
df['score'] = pd.to_numeric(df['score'], errors='coerce') # 转为数值型,异常转NaN✅ 优势:代码简洁、逻辑清晰、零条件判断,适用于所有行统一结构场景。
推荐方案二:
条件式赋值(更灵活)
若仅在存在备注时才创建 'note' 列(节省内存/语义明确),可用条件检查:
df['score'] = df['score'].str.split(', ')
df = df.explode('score').reset_index(drop=True)
tmp = df['score'].str.split(' ', n=1, expand=True)
df['score'] = tmp[0]
if 1 in tmp.columns: # 检查第二列是否存在
df['note'] = tmp[1]
df['score'] = pd.to_numeric(df['score'], errors='coerce')进阶方案:正则一次性解析(推荐用于复杂模式)
使用 str.extractall() 直接匹配数字主体与可选备注,无需手动 explode + split,性能更优且语义更强:
# 构建正则:(?P\d+) 匹配数字;(?: (?P [^,]+))? 非贪婪匹配空格后非逗号字符 pattern = r'(?P \d+)(?: (?P [^,]+))?' extracted = df.pop('score').str.extractall(pattern).droplevel('match') # 合并回原表(自动对齐索引) df = df.join(extracted) df['score'] = pd.to_numeric(df['score'], errors='coerce')
? 正则说明:
注意事项
综上,reindex() 是平衡简洁性与健壮性的首选;而正则方案在格式规律性强、需高可维护性时更具长期价值。
# 大数据
# 数据清洗
# pandas
# 字符串
# 可选
# 链式
# 串列
# 进阶
# 这是
# 多个
# 适用于
# 所需
# 不存在
# 更强
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11系统占用空间大怎么办 Win11深度瘦身清理指南【优化】
Windows10系统更新错误0x80070002_Win10自动更新失败手动修复
Win11如何设置鼠标灵敏度_Win11鼠标灵敏度调整教程【攻略】
Win11怎么关闭通知中心_Windows11系统通知与专注助手设置
C++中的constexpr和const有什么区别?(编译期常量)
Windows怎样拦截WPS弹窗广告_Windows拦截WPS弹窗广告设置【步骤】
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
Win11怎么关闭系统提示音_Windows11声音方案设为无声教程
如何在Golang中实现WebSocket广播_使用Channel和协程分发消息
用lighttpd能运行php吗_lighttpd配置php步骤【教程】
php下载安装包太大怎么下载_分卷压缩下载方法【教程】
Win11怎么设置声音输出设备_Windows11音量合成器单独调节应用
如何在Golang中使用log包输出不同级别日志_Golang log日志管理与分类
Win11文件扩展名怎么显示 Win11查看文件后缀名设置【步骤】
mac怎么退出id_MAC退出iCloud账号与Apple ID切换【指南】
Python数据挖掘进阶教程_分类回归与聚类案例解析
如何有效拦截拼接式恶意域名的垃圾信息
作用域操作符会影响性能吗_php静态调用性能分析【教程】
C#怎么创建控制台应用 C# Console App项目创建方法
php打包exe后无法写入文件_权限问题解决方法【教程】
php高频调试功能有哪些_php常用调试函数与工具汇总【解答】
如何在 Go 中正确初始化结构体中的 map 字段
如何提升Golang JSON序列化性能_Golang JSON编码效率优化方法
Python正则表达式实战_模式匹配说明【教程】
Mac如何修改Hosts文件?(本地开发与屏蔽网站)
如何在 Python 中将 ISO 8601 时间戳转换为日期并计算日期差值
Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系统【安全指南】
Windows 11无法安全删除U盘提示设备正在使用中怎么办_Windows 11找出占用设备进程
Windows执行文件被SmartScreen拦截原因_安全提示与绕过方式
Go 中实现 Python urllib.quote() 功能的等效方法
php查询数据怎么导出csv_查询结果转csv文件保存【操作】
PHP主流架构怎么处理表单验证_规则与自定义【技巧】
c++ stringstream用法详解_c++字符串与数字转换利器
如何使用正则表达式批量替换重复的 *- 模式为固定字符串
如何使用正则表达式批量替换重复的“-”模式为固定字符串
Python解释执行模型_字节码流程说明【指导】
php订单日志怎么记录物流_php记录订单物流变更日志指南【指南】
Win11怎么关闭边缘滑动手势_Windows11禁用触摸屏边缘操作
Win11怎么关闭应用权限_Windows11相机麦克风隐私管理
LINUX怎么设置系统语言_LINUX修改中文环境
如何在Golang中使用container/heap实现堆_Golang container/heap最小堆方法
Windows 11登录时提示“用户配置文件服务登录失败”怎么办_Windows 11修复损坏的用户配置文件
如何使用Golang编写单元测试_创建Test函数验证业务逻辑
php删除数据怎么清空表_truncate与delete区别及用法【汇总】
Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】
Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】
Win11怎么更改默认打开方式_Win11关联文件格式教程【详解】
Django 测试数据库表缺失与字段未创建问题的完整解决方案
PHP cURL GET请求:正确设置认证与自定义请求头的完整教程
c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】
2025-12-26
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。