如何在Pandas指定列的所有行中将数字转换为单词?附问题代码
解决Pandas DataFrame指定列数字转英文单词的问题
我来帮你拆解下遇到的问题,再给出靠谱的实现方案:
为什么直接处理int类型列没生效?
当列是int数值类型时,Pandas的DataFrame.replace()会直接忽略regex=True参数——这是Pandas的设计逻辑:数值类型列不支持正则匹配替换,所以你第一次操作相当于没做任何修改,数值自然还是原来的数字。
转成str类型后为什么得到lambda函数对象?
你转成str类型后用replace()的方式不对。Pandas的DataFrame.replace()在regex模式下,对函数替换的逻辑和字符串方法str.replace()不一样,直接传lambda会导致Pandas没有正确执行函数,反而把函数对象本身当成了替换值。
正确的实现方法
这里推荐两种实用的方式,都能完美实现需求:
方法1:用apply()直接处理(最简单通用)
不管列是int还是str类型,这种方式都能直接处理,逻辑清晰:
import pandas as pd import numpy as np from num2words import num2words as p # 假设你用的是num2words库 # 生成测试数据 df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD')) # 处理指定列(这里是第4列,列名D) df['D'] = df['D'].apply(lambda x: p(x)) # 查看结果 df['D'].head(2)
输出示例:
0 fifteen 1 eighty-nine Name: D, dtype: object
方法2:转字符串后用str.replace()(适合混合内容的列)
如果你的列里可能混合了非数字内容,只想替换纯数字部分,可以先转字符串,再用Series的字符串方法str.replace(),这里的函数参数会正确接收匹配到的内容:
df['D'] = df['D'].astype(str).str.replace(r'(?<!\S)\d+(?!\S)', lambda x: p(x.group()), regex=True)
和你之前的代码区别在于用了str.replace()(Series专属的字符串处理方法),而非DataFrame.replace(),前者对正则+函数替换的支持更符合预期。
总结
- 数值类型列别用带regex的
replace(),要么用apply()直接转换,要么先转字符串再处理。 - 处理字符串列的正则替换时,优先用
Series.str.replace(),它的函数替换逻辑更直观。
内容的提问来源于stack exchange,提问作者Shew
相关产品推荐
相关产品推荐

