如何拆分含多分隔符的DataFrame列并实现英文数字转数值?
Pandas 列拆分与英文数字转数值解决方案(含报错修复)
问题分析
报错ValueError: No valid number words found!是因为英文数字转数值的工具(如word2number)无法识别混杂分隔符、格式不规范的文本。解决核心是先清理拆分文本,再安全转换数值。
完整实现代码
import pandas as pd from word2number import w2n # 示例数据(可替换为你的真实数据) df = pd.DataFrame({ "cement_water": ["one hundred; twenty", "fifty, thirty", "seventy_forty", "invalid_text; 40"], "coarse_fine_aggregate": ["100_50", "150_75", "200_80", "250_90"] }) ### 1. 处理 cement_water 列:多分隔符拆分 + 文本清理 # 统一替换所有分隔符(; , _)为空格,再拆分列 df[["cement_raw", "water_raw"]] = df["cement_water"].str.replace(r"[;,_]", " ", regex=True).str.split(expand=True) # 去除文本前后多余空格 df["cement_raw"] = df["cement_raw"].str.strip() df["water_raw"] = df["water_raw"].str.strip() ### 2. 安全转换英文数字为数值(修复报错) def safe_word_to_num(text): """捕获转换异常,避免程序崩溃""" try: # 先尝试转数值(兼容纯数字文本) return float(text) if text.replace(".", "").isdigit() else w2n.word_to_num(text) except (ValueError, TypeError): # 无法识别时返回NA,后续可根据需求处理(如填充默认值) return pd.NA df["cement"] = df["cement_raw"].apply(safe_word_to_num) df["water"] = df["water_raw"].apply(safe_word_to_num) ### 3. 处理 coarse_fine_aggregate 列:下划线拆分转数值 df[["coarse_aggregate", "fine_aggregate"]] = df["coarse_fine_aggregate"].str.split("_", expand=True).astype(float) ### 4. 清理中间列(可选) df = df.drop(["cement_water", "cement_raw", "water_raw", "coarse_fine_aggregate"], axis=1) print(df)
关键细节说明
- 多分隔符处理:用正则
r"[;,_]"一次性替换所有目标分隔符,避免多次替换操作 - 报错修复:通过
try-except捕获转换异常,同时兼容纯数字文本(避免英文数字工具无法识别阿拉伯数字的问题) - 灵活性:无法识别的文本返回
pd.NA,可根据业务需求改为填充0、保留原文本等逻辑
内容的提问来源于stack exchange,提问作者Shivam Singh
相关产品推荐
相关产品推荐

