Python处理DataFrame移除单元格重复词时运行结果异常如何解决
需求目标
实现pandas DataFrame单元格内的单词去重,预期处理效果如下:
| 行号 | Current | Desired 输出 |
|---|---|---|
| 0 | John and Jane | John and Jane |
| 1 | John and John | John |
| 2 | John | John |
| 3 | Jane and Jane | Jane |
已尝试的失效方案
先后测试两种实现均未得到预期结果:
- 引入
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
相关产品推荐
相关产品推荐

