You need to enable JavaScript to run this app. Python Pandas使用num2words转数值为金额文本时遇NaN触发ValueError报错
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas使用num2words转数值为金额文本时遇NaN触发ValueError报错

报错原因

  • 原有代码在处理列时,先执行df.Total_value.astype(str),会把pandas原生的NaN空值转换为字符串"NaN",彻底丢失空值识别属性
  • 当字符串"NaN"传入处理函数时,因为字符串内部不存在小数点,调用x.split('.')只会返回长度为1的列表,无法解包为rupees和paise两个变量,直接触发解包类报错。

修正方案

  • 移除全列提前转字符串的操作,保留NaN的原生数据类型,让空值判断可以正常生效
  • 在转换函数开头增加空值判断,遇到NaN直接返回原值,不进入后续金额转单词的处理流程
  • 兼容纯整数、带小数的不同数值格式,避免拆分逻辑报错

修正后可直接运行的代码

from num2words import num2words
import pandas as pd

def word(x):
    # 空值直接返回,不做后续转换
    if pd.isna(x):
        return x
    
    x_str = str(x)
    # 拆分整数、小数部分,兼容无小数的整数值
    if '.' in x_str:
        rupees, paise = x_str.split('.')
    else:
        rupees = x_str
        paise = '0'
    
    # 转换卢比部分文本
    rupees_word = num2words(int(rupees), lang='en_IN') + ' Rupees'
    
    # 转换派萨部分文本
    paise_int = int(paise)
    if paise_int > 0:
        paise_word = ' And ' + num2words(paise_int, lang='en_IN') + ' Paise'
        final_text = rupees_word + paise_word
    else:
        final_text = rupees_word
    
    # 清理文本格式,匹配预期的大小写格式
    final_text = final_text.replace(',', '').title()
    return final_text

# 生成目标列,不修改原始Total_value列
df['value_words'] = df['Total_value'].apply(word)

效果匹配说明

运行上述代码后,输出会完全匹配预期格式:

  • 空值NaN会原样保留,不做转换
  • 整数金额会按照印度数字单位(lakh、thousand、hundred等)生成对应英文表述
  • 带小数的金额会自动拆分卢比、派萨部分,匹配预期的文本拼接格式

内容的提问来源于stack exchange,提问作者Manz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 16:06:00