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中的重复值去掉。此外,duplicated 和 drop_duplicates还可以通过多列的联合取值来筛选数据。


浙公网安备 33010602011771号