下面是几个常见的扩展场景及相应的解决方式。你可以根据自己的目标选择使用其中之一或多个组合。
✅ 目标 1:不仅处理数字重复,还处理任意文本重复,如 'abc,abc'
→ 'abc'
import re
df['modelCode'] = df['modelCode'].apply(lambda x: re.sub(r'([^,]+),\1', r'\1', x))
-
正则解释:
([^,]+)
:匹配非逗号的任意字符,直到逗号(即一个字段);,\1
:紧跟重复项;- 整体表示:只要
前面一段,后面一模一样
,就保留一份。
✅ 目标 2:处理 多个重复 项,例如 '123,123,123'
→ '123'
, 'abc,abc,abc'
→ 'abc'
import re
df['modelCode'] = df['modelCode'].apply(lambda x: re.sub(r'^([^,]+)(,\1)+$', r'\1', x))
-
正则解释:
^([^,]+)
:第一段非逗号字符;(,\1)+
:后面若干个重复的,相同内容
;$
:整串必须全部由重复组成,才替换。
✅ 目标 3:替换连续重复字段(即中间也可以有其它),例如:
'123,123,456,456'
→'123,456'
'abc,abc,def,ghi,ghi'
→'abc,def,ghi'
这需要使用 去重逻辑,用 Python 实现:
df['modelCode'] = df['modelCode'].apply(lambda x: ','.join(dict.fromkeys(x.split(','))))
- 利用
dict.fromkeys()
保持顺序去重; - 适合用于处理 列表形式字段(用逗号分隔)中的重复内容。
🔍 举例对比总结:
原始值 | 方法1(文本重复) | 方法2(全部重复) | 方法3(去重保顺序) |
---|---|---|---|
'123,123' | '123' | '123' | '123' |
'abc,abc' | 'abc' | 'abc' | 'abc' |
'123,123,123' | '123,123' | '123' | '123' |
'abc,abc,def' | 'abc,abc,def' | 无变化 | 'abc,def' |
'abc,def,abc' | 无变化 | 无变化 | 'abc,def' |
'a,a,b,c,c,c' | 无变化 | 无变化 | 'a,b,c' |
✅ 推荐方案(最通用)
如果你想处理各种重复(数字、文本、多个重复),并保持顺序干净,推荐使用 方法3:
df['modelCode'] = df['modelCode'].apply(lambda x: ','.join(dict.fromkeys(x.split(','))))
它是最稳健、实用的。