Python去重方法

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对象,类似生成器
<itertools.groupby object at 0x000002543BED2C78>
>>> list(lt)
[(1, <itertools._grouper object at 0x000002543BE82278>), (2, <itertools._grouper object at 0x000002543BED54A8>),
(3, <itertools._grouper object at 0x000002543BED55F8>),
(5, <itertools._grouper object at 0x000002543BED5630>), (6, <itertools._grouper object at 0x000002543BED5668>)] >>> for k, g in lt: print(k, end=' ') >>>

  

二、移除重复数据

通常来说,可以通过duplicated 方法返回一个布尔型 Series,每行中的布尔值表示该行是否是重复的。

  从上面的结果可以看出,第1、4、6行不是第一次出现的数据行,在后面的去重工作中可以考虑去除。如果想要直接去除数据中的重复行,可以考虑使用 drop_duplicates 方法,它用于返回一个移除了重复行的 DataFrame

 上面的结果显示,重复的数据行已经被移除。当然,前面介绍的这两种方法默认会判断全部列。在实际的数据处理案例中,可能只希望根据某一列(例如k1列)来过滤重复项。

 上面的方法中,通过 drop_duplicates(['k1']) 可以将 k1中的重复值去掉。此外,duplicateddrop_duplicates还可以通过多列的联合取值来筛选数据。

 

posted @ 2020-10-26 16:12  Eagle_Fly  阅读(1695)  评论(0)    收藏  举报