如何用正则表达式替换DataFrame中指定列的部分字符串?
问题:替换Pandas DataFrame中tag列|前的内容
原始DataFrame
fict={'well':['10B23','10B23','10B23','10B23','10B23','10B23'], 'tag':['15B22|TestSep_OutletFlow','15B22|TestSep_GasOutletFlow','15B22|TestSep_WellNum','15B22|TestSep_GasPresValve','15B22|TestSep_Temp','WHT']} df=pd.DataFrame(fict)
输出:
well tag 0 10B23 15B22|TestSep_OutletFlow 1 10B23 15B22|TestSep_GasOutletFlow 2 10B23 15B22|TestSep_WellNum 3 10B23 15B22|TestSep_GasPresValve 4 10B23 15B22|TestSep_Temp 5 10B23 WHT
需求
将tag列中|符号之前的所有内容替换为字符串11A22,无|的行保持原样,目标输出如下:
well tag 0 10B23 11A22|TestSep_OutletFlow 1 10B23 11A22|TestSep_GasOutletFlow 2 10B23 11A22|TestSep_WellNum 3 10B23 11A22|TestSep_GasPresValve 4 10B23 11A22|TestSep_Temp 5 10B23 WHT
错误尝试及结果
尝试的正则替换代码:
df['tag2']=df['tag'].str.replace(r'([a-z0-9]*)|TestSep_[a-z0-9]*','11A22',regex=True)
错误结果:
well tag tag2 0 10B23 15B22|TestSep_OutletFlow 11A2211A22B11A2211A22|11A2211A2211A22O11A2211A... 1 10B23 15B22|TestSep_GasOutletFlow 11A2211A22B11A2211A22|11A2211A2211A22G11A2211A... 2 10B23 15B22|TestSep_WellNum 11A2211A22B11A2211A22|11A2211A2211A22W11A2211A... 3 10B23 15B22|TestSep_GasPresValve 11A2211A22B11A2211A22|11A2211A2211A22G11A2211A... 4 10B23 15B22|TestSep_Temp 11A2211A22B11A2211A22|11A2211A2211A22T11A2211A22 5 10B23 WHT 11A22W11A22H11A22T11A22
错误原因
- 正则中的
|是逻辑或运算符,不是字面量竖线,未转义导致匹配逻辑混乱 - 匹配规则错误,没有精准定位
|之前的内容,而是拆分匹配零散字符,导致多次替换
正确解决方案
方法一:精准正则替换
df['tag'] = df['tag'].str.replace(r'^[^|]+', '11A22', regex=True)
- 正则解释:
^[^|]+匹配字符串开头到第一个|之间的所有非|字符,仅替换该部分,无|的行不受影响
方法二:字符串拆分拼接(更直观)
df['tag'] = df['tag'].apply(lambda x: '11A22|' + x.split('|')[1] if '|' in x else x)
- 逻辑:对每个tag值判断是否包含
|,是则拆分后保留后半部分并拼接前缀,否则返回原内容
验证结果
执行任意一种方法后,输出符合需求的DataFrame:
well tag 0 10B23 11A22|TestSep_OutletFlow 1 10B23 11A22|TestSep_GasOutletFlow 2 10B23 11A22|TestSep_WellNum 3 10B23 11A22|TestSep_GasPresValve 4 10B23 11A22|TestSep_Temp 5 10B23 WHT
内容的提问来源于stack exchange,提问作者roudan
相关产品推荐
相关产品推荐

