Python如何查找DataFrame列中指定子串位置并移除生成新列
实现方法
基于Pandas字符串方法+正则匹配即可完成需求,无需逐行循环,全列向量化处理性能优异。
- 支持以列表形式传入任意待匹配的目标子串,自动适配匹配规则,仅识别被英文半角括号包裹的目标内容,避免误匹配用户名本体中出现的相同字符
- 位置计数规则和示例完全对齐:从字符串起始位(0索引)开始计数,返回括号内目标子串首字符的索引值
- 自动清理清洗后用户名前后的多余空格
完整代码
import pandas as pd # 1. 初始化数据与匹配规则 # 替换为你的实际DataFrame即可 df = pd.DataFrame({ "User name": ["XYZ (R1)", "ABCD (R2) ", "LKMNP (R2)"] }) # 以列表形式传入需要查找的目标子串 targets = ["R1", "R2"] # 拼接正则规则,匹配 (R1)、(R2) 格式的片段,捕获括号内的目标值 match_pattern = rf"\(({'|'.join(targets)})\)" # 2. 生成各要求字段 # 提取括号内匹配到的目标子串 df["extract"] = df["User name"].str.extract(match_pattern, expand=False) # 计算目标子串的位置:左括号位置+1即为括号内子串首字符位置 df["Position"] = df.apply( lambda x: x["User name"].find(f"({x['extract']})") + 1, axis=1 ) # 移除括号及内部内容,清理前后多余空格得到新用户名 df["New name"] = df["User name"].str.replace(match_pattern, "", regex=True).str.strip()
运行结果
执行后输出的DataFrame如下:
User name extract Position New name 0 XYZ (R1) R1 5 XYZ 1 ABCD (R2) R2 6 ABCD 2 LKMNP (R2) R2 7 LKMNP
你给出的示例中第三行原始数据为
LKMNP (R2),目标输出写为LK (R2)/LK属于笔误,上述逻辑会完整保留括号前的所有用户名内容,符合常规清洗要求。如果存在单条用户名包含多个匹配目标的场景,可将正则调整为全局匹配后做行展开,上述代码适配当前单匹配的业务场景。如果存在未匹配到目标子串的行,对应extract、Position字段会返回空值,可根据业务需要额外加过滤或填充逻辑。
内容的提问来源于stack exchange,提问作者tej kiran
相关产品推荐
相关产品推荐

