Pandas正则替换失效:无法为Gas列无PASON的行添加该字符串
问题分析与解决
原代码无效的原因
你的正则表达式完全偏离了目标需求:
- 原正则
r'(\d+/\d+)(\t)(\d+)'是匹配「数字/数字+制表符+数字」的格式,但你的目标数据中,需要修改的是19/14、56/26这类不含PASON的纯分数字符串,既没有制表符,也没有后续数字,所以这个正则根本匹配不到任何需要修改的内容,自然不会生效。 - 同时,你的替换逻辑也错误,需求是给目标内容添加后缀
PASON,而非替换中间的制表符部分。
正确实现方法
以下是几种简洁有效的实现方式:
方法1:用str.endswith筛选后拼接(最直观)
import pandas as pd df = pd.DataFrame({'Depth':['7500', '7800', '8300', '8500'], 'Gas':['25-13 PASON', '9/8 PASON', '19/14', '56/26'], 'ID':[1, 2, 3, 4]}) # 筛选出不以PASON结尾的行,添加后缀 mask = ~df['Gas'].str.endswith('PASON') df.loc[mask, 'Gas'] += ' PASON'
方法2:用正则替换(匹配所有不含PASON结尾的内容)
# 负向预查匹配所有不以PASON结尾的字符串,添加后缀 df['Gas'] = df['Gas'].replace(r'^(?!.*PASON$).+$', r'\g<0> PASON', regex=True)
正则说明:^(?!.*PASON$).+$表示“整个字符串结尾不是PASON的内容”,\g<0>指代匹配到的完整字符串。
方法3:用str.contains筛选
mask = ~df['Gas'].str.contains('PASON', case=False) df.loc[mask, 'Gas'] = df.loc[mask, 'Gas'] + ' PASON'
此方法会匹配所有不含PASON的内容(无论位置),如果需要严格匹配结尾,优先用方法1或2。
内容的提问来源于stack exchange,提问作者Heather
相关产品推荐
相关产品推荐

