如何用另一DataFrame的字符串替换pandas列中的指定子串?
解决Pandas中基于映射表的子串批量替换问题
核心思路
要实现用df2的映射关系替换df1中Long_string列的指定子串,关键是先把映射表转换成键值对字典,再利用Pandas的str.replace()方法批量替换所有匹配的子串(注意设置精确匹配避免误替换)。
完整代码实现
import pandas as pd # 初始化原始数据 data={"ID": ["zx125", "zx137", "zx897", "zx567", "zx694"],"Long_string": ["TM~AA~Loc1::MH~CC~Loc1::LH~BF~Loc2::CM~CD~Loc2::CH~CD~Loc2", "MH~BGG~Loc1::LH~BF~Loc2::CM~RR~Loc2", "TM~VD~Loc1::MH~EC~Loc1::LH~BF~Loc2", "MH~BF~Loc1::LH~BF~Loc2::CH~CD~Loc2","DF~VD~Loc3::MH~EC~Loc1::LH~BF~Loc2::CH~CD~Loc2"]} df1 = pd.DataFrame(data) # 初始化映射表 mapping = {"Before Mapping": ["MH~CC~Loc1", "LH~BF~Loc2", "CH~CD~Loc2"],"After Mapping": ["MH~RT~Loc1","LH~BE~Loc2","CH~CE~Loc2"]} df2 = pd.DataFrame(mapping) # 将映射表转换为替换字典 replace_mapping = dict(zip(df2["Before Mapping"], df2["After Mapping"])) # 批量替换子串,生成New_string列 # regex=False确保是精确匹配子串,而非正则表达式匹配 df1["New_string"] = df1["Long_string"].str.replace(replace_mapping, regex=False) # 查看结果 print(df1)
关键细节说明
- 字典转换:用
zip()把df2的两列配对,生成{待替换子串: 替换后子串}的字典,方便批量操作。 str.replace()的参数:- 直接传入字典可一次性处理所有映射关系,无需循环遍历。
- 设置
regex=False是为了避免把待替换子串中的特殊字符(如~)当作正则表达式语法,确保精确匹配完整子串,防止误替换类似结构的其他内容。
输出结果验证
运行代码后,New_string列会按映射规则完成替换:
- 原
MH~CC~Loc1替换为MH~RT~Loc1 - 原
LH~BF~Loc2替换为LH~BE~Loc2 - 原
CH~CD~Loc2替换为CH~CE~Loc2
所有匹配的子串都会被替换,其他内容保持不变。
内容的提问来源于stack exchange,提问作者Josephine Fang
相关产品推荐
相关产品推荐

