Python pandas如何根据另一列的列表逐行替换指定列字符串
pandas逐行基于列表值替换文本列内容
场景说明
处理目标为pandas DataFrame,核心字段定义:
Content_Clean:字符串类型列,存储原始文本Removals:列表类型列,逐行存储对应文本中需要移除的字符串
替换要求:将每行Content_Clean中出现的、同属该行Removals列表内的字符串替换为空格,示例:
原始文本:
Johnny and Mary went to the store
同行待移除列表:['Johnny','Mary']
输出结果:and went to the store
原有代码问题分析
之前写的两段代码逻辑存在明显缺陷,无法满足逐行替换要求:
- 全局循环替换写法
for i in data_eng['Removals']: for u in i: data_eng['Content_Clean_II'] = data_eng['Content_Clean'].str.replace(u,' ')
该逻辑会遍历所有行的待移除词,对全表所有文本做全局替换,没有做行级规则隔离,最终会把所有行出现过的待移除词全部替换,和逐行匹配的需求完全不符。
- 单字段apply配re.sub写法
data_eng['Content_Clean_II'] = data_eng['Content_Clean'].apply(lambda x: re.sub(data_eng.loc[data_eng['Content_Clean'] == x, 'Removals'].values[0], '', x))
存在两个核心问题:一是re.sub的匹配模式参数仅支持字符串格式,无法直接传入列表做批量匹配;二是通过文本内容反查待移除列表的写法,在存在重复文本时会触发索引错误,稳定性极差。
实现方案
逐行处理时同时读取同行的文本和待移除列表即可,以下两种方案均可稳定实现需求:
方案1:普通字符串替换(无额外依赖,执行速度快)
不需要引入正则库,逐行遍历替换即可,适合不需要严格整词匹配的场景:
def clean_row_content(row): cleaned_text = row['Content_Clean'] for remove_str in row['Removals']: cleaned_text = cleaned_text.replace(remove_str, ' ') # 可选:清理替换后产生的连续多余空格 return ' '.join(cleaned_text.split()) # 按行应用处理逻辑 data_eng['Content_Clean_II'] = data_eng.apply(clean_row_content, axis=1)
方案2:正则整词匹配(避免子串误替换)
如果需要严格匹配完整词汇(例如待移除词为cat时,不希望误替换category中包含的cat子串),可以用正则拼接整词匹配规则:
import re def clean_row_content_regex(row): original_text = row['Content_Clean'] # 转义待移除词中的特殊正则字符,拼接为整词匹配模式 remove_pattern = r'\b(' + '|'.join(re.escape(word) for word in row['Removals']) + r')\b' cleaned_text = re.sub(remove_pattern, ' ', original_text) # 清理多余连续空格 return ' '.join(cleaned_text.split()) data_eng['Content_Clean_II'] = data_eng.apply(clean_row_content_regex, axis=1)
内容的提问来源于stack exchange,提问作者Edd
相关产品推荐
相关产品推荐

