Python Pandas全数据范围如何将X,X%格式的百分值替换为X.X%
Pandas 全数据范围非标准百分格式定向替换方案
核心处理规则严格匹配需求:仅替换夹在两个数字字符之间、且属于百分号前数值段的逗号,不会误伤文本分句逗号、非百分结构的千位分隔逗号等其他内容。
实现代码
单列定向处理(仅针对ingredients_text列,列内全量单元格覆盖)
如果仅需要处理指定的文本列,直接对列的字符串方法做正则替换即可:
# 对目标列全量内容做替换 df['ingredients_text'] = df['ingredients_text'].str.replace( pat = r'(\d+),(\d+%)', repl = r'\1.\2', regex = True )
全数据框覆盖处理
如果需要遍历整个数据框所有单元格,对所有符合规则的文本内容统一替换,可使用如下写法(仅对字符串类型内容生效,数值型等其他类型内容不做改动):
import re df = df.applymap( lambda cell: re.sub(r'(\d+),(\d+%)', r'\1.\2', cell) if isinstance(cell, str) else cell )
规则适配调整
如果需要避免误改千位分隔的百分写法(例如原生想表达1000%、写为1,000%时,不希望被替换为1.000%),可以调整匹配规则,仅识别逗号后紧跟1-2位小数的结构,对应的正则匹配规则修改为:
pat = r'(\d+),(\d{1,2}%)'
处理效果示例
| 原始内容 | 替换后内容 | 触发逻辑 |
|---|---|---|
| 小麦粉含量 5,5%,食用盐 | 小麦粉含量 5.5%,食用盐 | 逗号夹在两个数字之间,且后续绑定% |
| 水分 12,3%,总糖 0,25% | 水分 12.3%,总糖 0.25% | 多个符合规则的片段会被全部替换 |
| 添加剂总量 1,000mg/100g | 添加剂总量 1,000mg/100g | 逗号后续无%绑定,不触发替换 |
| 配料表: 糖, 盐, 水 | 配料表: 糖, 盐, 水 | 逗号两侧不是数字,不触发替换 |
相比逐行循环判断的实现,基于Pandas内置字符串方法的正则替换处理效率更高,可覆盖列内/数据框内所有匹配的内容,不会出现遗漏。单列处理时使用Pandas内置的
str.replace方法,默认开启正则支持,不需要额外导入正则模块;全数据框逐单元格处理时,因为直接操作Python原生字符串,需要导入re模块调用re.sub实现正则替换,两者的匹配和替换逻辑完全一致,不会出现处理结果的偏差。
内容的提问来源于stack exchange,提问作者Yoss
相关产品推荐
相关产品推荐

