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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:19:17