You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分含多分隔符的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:42:42