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

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

原有代码问题分析

之前写的两段代码逻辑存在明显缺陷,无法满足逐行替换要求:

  1. 全局循环替换写法
for i in data_eng['Removals']:
    for u in i:
        data_eng['Content_Clean_II'] = data_eng['Content_Clean'].str.replace(u,' ')

该逻辑会遍历所有行的待移除词,对全表所有文本做全局替换,没有做行级规则隔离,最终会把所有行出现过的待移除词全部替换,和逐行匹配的需求完全不符。

  1. 单字段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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:33:17