如何使用Pandas基于某列值删除另一列中的对应字符?
问题解决:根据指定字符删除DataFrame列中对应内容
原始DataFrame
import pandas as pd df = pd.DataFrame([['ABCD','B'],['ABFJS','A,J'],['DGQEX','']], index = [1,2,3],columns=['A','B'])
需求说明
- 第一行:根据B列的"B",删除A列"ABCD"中的"B",保留"ACD"
- 第二行:根据B列的"A,J",删除A列"ABFJS"中的"A"和"J",保留"BFS"
- 第三行:B列为空,A列保持不变
问题分析
你之前的代码返回[BFJS, ABFS],核心原因是每次替换都基于原始的A列字符串,而非前一次替换后的结果。比如第二行先把"A"替换成""得到"BFJS",再把"J"替换成""时又用了原始的"ABFJS",最终得到两个中间值,而非叠加替换后的最终结果。
正确实现方法
方法一:逐步叠加替换
在apply中对每行的A列字符串,依次用B列的每个字符进行替换,每次替换都基于上一次的结果:
def remove_chars(row): result = row['A'] # 过滤掉B列拆分后产生的空字符 chars_to_remove = [c for c in str(row['B']).split(',') if c] for c in chars_to_remove: result = result.replace(c, '') return result df['A_cleaned'] = df.apply(remove_chars, axis=1)
运行后df['A_cleaned']的结果为:
1 ACD 2 BFS 3 DGQEX Name: A_cleaned, dtype: object
方法二:正则表达式批量替换
把B列的字符拼接成正则匹配模式,一次性替换所有目标字符,效率更高:
import re def remove_chars_regex(row): chars = str(row['B']).replace(',', '') if not chars: return row['A'] # 生成匹配任意目标字符的正则模式,转义特殊字符避免出错 pattern = re.compile(f'[{"".join(re.escape(c) for c in chars)}]') return pattern.sub('', row['A']) df['A_cleaned'] = df.apply(remove_chars_regex, axis=1)
内容的提问来源于stack exchange,提问作者user19560886
相关产品推荐
相关产品推荐

