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

Python处理DataFrame移除单元格重复词时运行结果异常如何解决

需求目标

实现pandas DataFrame单元格内的单词去重,预期处理效果如下:

行号CurrentDesired 输出
0John and JaneJohn and Jane
1John and JohnJohn
2JohnJohn
3Jane and JaneJane
已尝试的失效方案

先后测试两种实现均未得到预期结果:

  • 引入collections.OrderedDict实现去重,运行后目标列被填充为o d i c t _ k e y s ( [ ' n a n ' ] ),对应代码:
from collections import OrderedDict

df['Current'] = (df['Desired'].astype(str).str.split()
                              .apply(lambda x: OrderedDict.fromkeys(x).keys())
                              .astype(str).str.join(' '))
  • 使用str.replace结合正则匹配替换重复词,运行后目标列全部填充为nan,对应代码:
df['Desired'] = df['Current'].str.replace(r'\b(\w+)(\s+\1)+\b', r'\1')
可行实现方案

方案1:通用保序去重(推荐,完全匹配需求)

该方案不要求重复单词相邻,只要单元格内出现过的单词都会保留第一次出现的位置,后续重复项全部移除,Python 3.7+版本原生dict默认保持插入顺序,无需额外引入第三方库:

df["Desired"] = df["Current"].astype(str).str.split().apply(
    lambda word_list: " ".join(dict.fromkeys(word_list).keys())
)

原OrderedDict方案失效原因

  • 列逻辑写反:代码错误读取Desired列作为处理源,处理结果又赋值回Current列,逻辑完全颠倒
  • 类型转换顺序错误:在字符串拼接前就对dict_keys视图对象执行astype(str),会把视图对象本身转为dict_keys([...])格式的字符串,后续执行str.join时会把字符串拆成单个字符拼接,才会出现字符间带空格的异常输出

方案2:正则匹配方案(仅适用于相邻重复词场景)

原正则方案失效原因有两点:

  • 参数缺失:高版本pandas中str.replace默认regex=False,会把传入的正则串当普通文本匹配,无法识别正则语法,空值匹配后直接返回nan
  • 场景限制:该正则只能匹配连续相邻的重复词,无法处理示例中John and John这类中间间隔其他单词的重复场景。
    如果仅需要移除相邻重复词,可使用修正后的代码:
df["Desired"] = df["Current'].str.replace(
    r'\b(\w+)(?:\s+\1)+\b', r'\1', regex=True
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:30:54