如何修正Pandas处理CSV数据时的字符串替换错误?
CSV字符串转换代码修正
输入数据
ABCD0011 ABCD1404 ABCD1255
转换规则与输出对比
转换规则:保留字符串开头的字母部分,去除字母后数字部分的前导零,最终格式为[字母部分]_[去前导零的数字部分]_0
| 输入 | 预期输出 | 实际输出(原代码) |
|---|---|---|
| ABCD0011 | ABCD_11_0 | ABCD_0011_0 |
| ABCD1404 | ABCD_1404_0 | ABCD_144_0 |
| ABCD1255 | ABCD_1255_0 | ABCD_1255_0 |
原代码问题
原代码:
import numpy as np import pandas as pd df = pd.read_csv('Book1.csv') df.A = df.A.str.replace('[0-9]+', '')+'_'+df.A.str.replace('([A-Z])+', '')+'_0'
问题点:
- 直接保留所有数字部分,未处理字母后的前导零,导致
ABCD0011无法得到预期结果 - 正则
([A-Z])+存在匹配漏洞,会误处理数字中的零(如ABCD1404被错误转换为ABCD_144_0)
修正方案
方案一:拆分处理(可读性高)
通过正则拆分字母和数字部分,单独处理数字前导零后拼接:
import pandas as pd # 读取CSV文件 df = pd.read_csv('Book1.csv') # 拆分字母前缀与数字后缀 df[['prefix', 'num']] = df['A'].str.extract(r'^([A-Z]+)(\d+)$', expand=True) # 去除数字部分的前导零,若结果为空则设为'0'(兼容全零场景) df['processed_num'] = df['num'].str.lstrip('0').replace('', '0') # 拼接成目标格式 df['A'] = df['prefix'] + '_' + df['processed_num'] + '_0' # 清理中间临时列(可选) df = df.drop(['prefix', 'num', 'processed_num'], axis=1)
方案二:正则直接替换(简洁高效)
用正则捕获组一次性完成匹配与替换:
import pandas as pd df = pd.read_csv('Book1.csv') # 匹配字母前缀、前导零、剩余数字,替换为目标格式 df['A'] = df['A'].str.replace( r'^([A-Z]+)0*(\d*)$', lambda m: f"{m.group(1)}_{m.group(2) if m.group(2) else '0'}_0" )
两种方案均可得到符合预期的输出,方案二更简洁,方案一可读性更强,适合复杂场景扩展。
内容的提问来源于stack exchange,提问作者Abdullah
相关产品推荐
相关产品推荐

