原始数据中,往往包含大量重复的行,需要我们删除,让数据集更健康。
In [51]: df = pd.DataFrame({'k1':['one','two']*3 + ['two'], 'k2':[1,1,2,3,3,4,4]}) In [52]: df # 最后一行是重复的 Out[52]: k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 6 two 4 In [53]: df.duplicated() # Out[53]: 0 False 1 False 2 False 3 False 4 False 5 False 6 True dtype: bool In [54]: df.drop_duplicates() Out[54]: k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 In [55]: df # 并没有改变原数据 Out[55]: k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 6 two 4
上面,使用duplicated方法判断各行是否有重复,并返回一个布尔值Series。然后使用drop_duplicates方法将重复行删除,留下那些不重复的。
如果想指定根据某列的数据进行去重判断和操作,可以指定列名:
In [56]: df['v1'] = range(7) In [57]: df Out[57]: k1 k2 v1 0 one 1 0 1 two 1 1 2 one 2 2 3 two 3 3 4 one 3 4 5 two 4 5 6 two 4 6 In [58]: df.drop_duplicates(['k1']) Out[58]: k1 k2 v1 0 one 1 0 1 two 1 1
默认情况下都是保留第一个观察到的值,如果想保留最后一个,可以使用参数keep='last':
In [59]: df.drop_duplicates(['k1','k2'], keep='last') Out[59]: k1 k2 v1 0 one 1 0 1 two 1 1 2 one 2 2 3 two 3 3 4 one 3 4 6 two 4 6