1、利用集合set的特性
>>> lst = [1, 2 , 2, 3, 3, 5, 6, 7, 2, 1]
>>> list(set(lst))
[1, 2, 3, 5, 6, 7]
>>>
可以通过列表中索引(index)的方法保证去重后的顺序不变
>>> ls = [1, 2, 3, 3, 5, 2, 1, 3, 6, 1]
>>> lst = list(set(ls))
>>> lst.sort(key=ls.index)
>>> lst
[1, 2, 3, 5, 6]
>>>
如果序列的值都是 hashable 类型,可以利用生成器解决去重后的顺序不变的问题。(Python Cookbook)
>>> def dedupe(items):
... seen = set()
... for item in items:
... if item not in seen:
... yield item
... seen.add(item)
...
>>>
>>> lst = [1, 2, 3, 3, 5, 2, 1, 3, 6, 1]
>>> list(dedupe(lst))
[1, 2, 3, 5, 6]
>>>
2、利用字典键不能重复的特性
>>> lst
[1, 2, 2, 3, 3, 5, 6, 7, 2, 1]
>>> list(dict.fromkeys(lst))
[1, 2, 3, 5, 6, 7]
>>>
3、利用for循环
>>> new_list = []
>>> for i in lst:
if i not in new_list:
new_list.append(i)
>>> new_list
[1, 2, 3, 5, 6, 7]
>>>
4、利用while循环
>>> def dup_rem(lst):
for i in lst:
while lst.count(i) > 1:
lst.remove(i)
return lst
>>>
>>> ls = [1, 2, 3, 3, 5, 2, 1, 3, 6, 1]
>>> dup_rem(ls)
[5, 2, 3, 6, 1]
5、使用itertools模块的grouby方法
>>> import itertools
>>> ls = [1, 2, 3, 3, 5, 2, 1, 3, 6, 1]
>>> ls.sort()
>>> lt = itertools.groupby(ls)
>>> lt # lt 是 itertools模块下的groupby对象,类似生成器
>>> list(lt)
[(1, ), (2, ),
(3, ),
(5, ), (6, )]
>>> for k, g in lt:
print(k, end=' ')
>>>
二、移除重复数据
通常来说,可以通过duplicated 方法返回一个布尔型 Series,每行中的布尔值表示该行是否是重复的。
从上面的结果可以看出,第1、4、6行不是第一次出现的数据行,在后面的去重工作中可以考虑去除。如果想要直接去除数据中的重复行,可以考虑使用 drop_duplicates 方法,它用于返回一个移除了重复行的 DataFrame。
上面的结果显示,重复的数据行已经被移除。当然,前面介绍的这两种方法默认会判断全部列。在实际的数据处理案例中,可能只希望根据某一列(例如k1列)来过滤重复项。
上面的方法中,通过 drop_duplicates(['k1'])可以将 k1中的重复值去掉。此外,duplicated 和 drop_duplicates还可以通过多列的联合取值来筛选数据。