Pandas使用str.title()转首字母大写时如何保留罗马数字大写格式
问题根因
pandas.Series.str.title() 方法会对字符串中所有单词做无差别格式转换:强制每个单词首字母大写、其余字母转小写,不具备语义识别能力,因此会把全大写的罗马数字(如III、VI)错误转换成Iii、Vi格式。
实现方案
核心逻辑是拆分字符串中的每个单词,单独识别罗马数字片段做特殊处理:普通单词执行首字母大写逻辑,罗马数字片段保留全大写格式,最后拼接为完整字符串。
实现代码
import re import pandas as pd # 匹配纯罗马数字单词的正则:标准罗马数字仅由I/V/X/L/C/D/M 7个字符组成 ROMAN_WORD_REG = re.compile(r'^[IVXLCDM]+$') def process_model_str(text): word_list = text.split() res = [] for word in word_list: # 匹配到罗马数字时,统一转全大写保留格式 if ROMAN_WORD_REG.fullmatch(word.upper()): res.append(word.upper()) # 普通单词做首字母大写处理 else: res.append(word.capitalize()) return ' '.join(res) # 逐行应用处理逻辑到Model列 DF['Model'] = DF['Model'].apply(process_model_str)
处理效果
执行代码后得到的结果符合预期:
| ID | Model |
|---|---|
| 1 | Power Jet III |
| 2 | Adi Max VI |
适配调整提示
- 如果你的场景中存在超过3999的大数字罗马数字(通常用上划线标记千倍数值),可以对应调整正则匹配规则适配。
- 如果Model列中还存在其他需要固定全大写的缩写(如品牌缩写、行业通用缩写),可以在判断分支中增加白名单判断,对这类词统一保留全大写格式即可。
内容的提问来源于stack exchange,提问作者Maximiliano Vazquez
相关产品推荐
相关产品推荐

