You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pandas删除DataFrame某列中与另一列匹配的子串

你之前的代码df.FULL_NAME.replace({str(df['NAME']):''}, regex=True)无法生效的核心原因是:str(df['NAME'])会将整个NAME列的Series对象转为包含索引、全列取值的一段汇总字符串,并非实现每行的FULL_NAME和当前行的NAME值做匹配替换的逻辑。


方案1:逐行apply实现(逻辑直观,适合中小数据集)

这个方案逻辑最好理解,同时会自动处理NaN的场景,也可以灵活控制替换规则,避免替换后出现多余空格、正则特殊字符报错等问题:

import pandas as pd
import re

df['FULL_NAME'] = df.apply(
    lambda row: re.sub(
        rf'\s*{re.escape(str(row["NAME"]))}\s*',
        ' ',
        str(row['FULL_NAME'])
    ).strip()
    if pd.notna(row['FULL_NAME']) and pd.notna(row['NAME'])
    else row['FULL_NAME'],
    axis=1
)

方案2:向量化操作(性能更高,适合百万级以上大数据集)

如果数据集规模很大,apply的遍历性能会偏低,可以用Pandas原生向量化字符串操作提升执行效率:

import pandas as pd

mask = df['FULL_NAME'].notna() & df['NAME'].notna()
df.loc[mask, 'FULL_NAME'] = (
    df.loc[mask, 'FULL_NAME']
    .str.replace(df.loc[mask, 'NAME'].apply(re.escape), '', regex=True)
    .str.replace(r'\s+', ' ', regex=True)
    .str.strip()
)

两种方案执行后都会得到你预期的输出结果:

FULL_NAME   NAME
0              LAST  FIRST
1               NaN    NaN
2        FIRST LAST  NAME2
3             FIRST  NAME3
4        FIRST LAST  NAME4

内容的提问来源于stack exchange,提问作者S S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 06:54:02