DataFrame列含数字前缀字符串替换失败问题求助
问题原因
你用的replace方法默认是完全匹配整个字符串,当列值是1.Goalkeeper时,和字典里的Goalkeeper完全不匹配,所以替换失效;而不带数字前缀的Goalkeeper能完全匹配,因此可以正常替换。
解决方案
方法1:开启正则匹配(最简方案)
修改代码,给replace加上regex=True参数,让字典的键作为正则模式匹配字符串中的子串:
replace_dict = { 'Goalkeeper':'GK', 'Left-Back':'LI', 'Defensive Midfield':'MCD', 'Right Midfield':'MD', 'Attacking Midfield':'MP', 'Right Winger':'ED', 'Centre-Forward':'DC', 'Centre-Back':'DFC', 'Right-Back':'LD', 'Central Midfield':'MC', 'Second Striker':'SD', 'Left Midfield':'MI', 'Left Winger':'EI', 'N':'', 'None':'', 'Sweeper':'DFC' } df2['Posicion'] = df2['Posicion'].replace(replace_dict, regex=True)
开启regex=True后,不管字符串前面有没有数字+点的前缀,只要后面的位置名称和字典键匹配,就会自动替换对应的部分。
方法2:精准匹配前缀(更可控)
如果需要确保只替换带数字前缀的内容,或者要更精准控制替换逻辑,可以用正则分组保留前缀,再替换位置名称:
import re pos_map = { 'Goalkeeper':'GK', 'Left-Back':'LI', 'Defensive Midfield':'MCD', 'Right Midfield':'MD', 'Attacking Midfield':'MP', 'Right Winger':'ED', 'Centre-Forward':'DC', 'Centre-Back':'DFC', 'Right-Back':'LD', 'Central Midfield':'MC', 'Second Striker':'SD', 'Left Midfield':'MI', 'Left Winger':'EI', 'N':'', 'None':'', 'Sweeper':'DFC' } def replace_pos(s): # 匹配数字+点开头的格式 match = re.match(r'(\d+\.)(.*)', s) if match: # 保留前缀,替换后面的位置名 return match.group(1) + pos_map.get(match.group(2), match.group(2)) # 无前缀的情况直接替换 return pos_map.get(s, s) df2['Posicion'] = df2['Posicion'].apply(replace_pos)
核心要点
- Pandas的
replace默认regex=False,仅匹配完整字符串,无法处理带前缀的子串替换。 - 开启
regex=True后,会将字典键作为正则表达式,匹配字符串中的任意子串,从而实现你需要的部分替换效果。
内容的提问来源于stack exchange,提问作者Carlos Lozano
相关产品推荐
相关产品推荐

