如何使用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
相关产品推荐
相关产品推荐

