
本文介绍使用Pandas的str.normalize('NFKC')方法高效、安全地将Excel中混有日文字符的全角数字(如「890」)批量转换为标准ASCII数字(如「890」),避免手动映射或正则替换的复杂性与风险。
本文介绍使用pandas的`str.normalize('nfkc')`方法高效、安全地将excel中混有日文字符的全角数字(如「890」)批量转换为标准ascii数字(如「890」),避免手动映射或正则替换的复杂性与风险。
在处理含东亚文字(如日文、中文)的文本数据时,常遇到全角字符(Full-width characters)——包括全角数字(0123456789)、全角标点(如ー、,、。)等。它们视觉上与半角字符相似,但Unicode编码不同,会导致数值解析失败、正则匹配失效或排序异常等问题。例如:
いつもありがとう890ございます → 实际Unicode:U+FF18 U+FF19 U+FF10 忙しい7ー10ー1ところ → 全角7、全角连接号、全角10、全角1
直接调用unicodedata.normalize('NFKC', s)虽可行,但在Pandas DataFrame场景下,应优先使用向量化字符串方法 Series.str.normalize(),它专为列级批量处理设计,性能更高、语法更清晰,且自动处理缺失值(NaN)和非字符串类型,避免to_string()导致的数据结构破坏(如索引、列名混入结果)。
✅ 正确做法(推荐):
import pandas as pd
# 读取Excel文件(单列示例)
df = pd.read_excel("data.xlsx", usecols=[0], header=None, names=["text"])
# 对目标列执行NFKC标准化:全角→半角,兼容字符规范化
df["text"] = df["text"].str.normalize('NFKC')
# 查看结果
print(df["text"].tolist())
# 输出:
# ['いつもありがとう890ございます', '忙しい7ー10ー1ところ']
⚠️ 注意事项:
- NFKC(Normalization Form KC)是最适用于此场景的标准形式:它不仅将全角数字/字母/标点转为半角(如8→8、A→A),还会对兼容字符(如上标数字、罗马数字)做合理映射,并合并组合字符,兼顾可读性与实用性。
- 避免使用NFD/NFC:它们主要处理变音符号分解与组合,不改变全角/半角状态。
- str.normalize()仅作用于字符串类型;若列中含数字、空值或混合类型,Pandas会自动跳过非字符串项(返回原值或NaN),无需预先清洗类型。
- 中文/日文环境显示优化(非必需但建议):
pd.options.display.unicode.east_asian_width = True # 正确计算东亚字符宽度 pd.options.display.unicode.ambiguous_as_wide = True # 将模糊宽度字符视为宽字符
? 扩展提示:若需保留某些全角标点(如日文长音符ー),而仅转换数字,可结合正则替换:
import re df["text"] = df["text"].str.replace(r'[0-9]', lambda m: chr(ord(m.group()) - 0xFEE0), regex=True)
但通常NFKC已足够健壮——它会将ー(U+30FC)保留为半角-(U+002D)或保持原形(取决于字体支持),符合多数下游处理需求。
综上,df["col"].str.normalize('NFKC') 是处理此类问题的标准、高效、可维护的解决方案。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











