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
相关产品推荐
相关产品推荐

