Pandas 去重

2022-07-13 10:52 更新

“去重”通過字面意思不難理解,就是刪除重復(fù)的數(shù)據(jù)。在一個(gè)數(shù)據(jù)集中,找出重復(fù)的數(shù)據(jù)刪并將其刪除,最終只保存一個(gè)唯一存在的數(shù)據(jù)項(xiàng),這就是數(shù)據(jù)去重的整個(gè)過程。刪除重復(fù)數(shù)據(jù)是數(shù)據(jù)分析中經(jīng)常會(huì)遇到的一個(gè)問題。通過數(shù)據(jù)去重,不僅可以節(jié)省內(nèi)存空間,提高寫入性能,還可以提升數(shù)據(jù)集的精確度,使得數(shù)據(jù)集不受重復(fù)數(shù)據(jù)的影響。

Panda DataFrame 對(duì)象提供了一個(gè)數(shù)據(jù)去重的函數(shù) drop_duplicates(),本節(jié)對(duì)該函數(shù)的用法做詳細(xì)介紹。

函數(shù)格式

 drop_duplicates()函數(shù)的語法格式如下:

df.drop_duplicates(subset=['A','B','C'],keep='first',inplace=True)

參數(shù)說明如下:

  • subset:表示要進(jìn)去重的列名,默認(rèn)為 None。
  • keep:有三個(gè)可選參數(shù),分別是 first、last、False,默認(rèn)為 first,表示只保留第一次出現(xiàn)的重復(fù)項(xiàng),刪除其余重復(fù)項(xiàng),last 表示只保留最后一次出現(xiàn)的重復(fù)項(xiàng),F(xiàn)alse 則表示刪除所有重復(fù)項(xiàng)。
  • inplace:布爾值參數(shù),默認(rèn)為 False 表示刪除重復(fù)項(xiàng)后返回一個(gè)副本,若為 Ture 則表示直接在原數(shù)據(jù)上刪除重復(fù)項(xiàng)。

實(shí)際應(yīng)用

首先創(chuàng)建一個(gè)包含有重復(fù)值的 DataFrame 對(duì)象,如下所示:

import pandas as pd
data={
    'A':[1,0,1,1],
    'B':[0,2,5,0],
    'C':[4,0,4,4],
    'D':[1,0,1,1]
}
df=pd.DataFrame(data=data)
print(df)

輸出結(jié)果:

  A B C D
0 1 0 4 1
1 0 2 0 0
2 1 5 4 1
3 1 0 4 1

1) 默認(rèn)保留第一次出現(xiàn)的重復(fù)項(xiàng)

import pandas as pd
data={
  
    'A':[1,0,1,1],
    'B':[0,2,5,0],
    'C':[4,0,4,4],
    'D':[1,0,1,1]
}
df=pd.DataFrame(data=data)
#默認(rèn)保留第一次出現(xiàn)的重復(fù)項(xiàng)
df.drop_duplicates()

輸出結(jié)果:

  A B C D
0 1 0 4 1
1 0 2 0 0
2 1 5 4 1

2) keep=False刪除所有重復(fù)項(xiàng)

import pandas as pd
data={
    'A':[1,0,1,1],
    'B':[0,2,5,0],
    'C':[4,0,4,4],
    'D':[1,0,1,1]
}
df=pd.DataFrame(data=data)
#默認(rèn)保留第一次出現(xiàn)的重復(fù)項(xiàng)
df.drop_duplicates(keep=False)

輸出結(jié)果:

  A B C D
1 0 2 0 0
2 1 5 4 1

3) 根據(jù)指定列標(biāo)簽去重

import pandas as pd
data={
   
    'A':[1,3,3,3],
    'B':[0,1,2,0],
    'C':[4,5,4,4],
    'D':[3,3,3,3]
}
df=pd.DataFrame(data=data)
#去除所有重復(fù)項(xiàng),對(duì)于B列來說兩個(gè)0是重復(fù)項(xiàng)
df.drop_duplicates(subset=['B'],keep=False)
#簡(jiǎn)寫,省去subset參數(shù)
#df.drop_duplicates(['B'],keep=False)
print(df)

輸出結(jié)果:

  A B C D
1 3 1 5 3
2 3 2 4 3

從上述示例可以看出,刪除重復(fù)項(xiàng)后,行標(biāo)簽使用的數(shù)字是原來的,并沒有從 0 重新開始,那么我們應(yīng)該怎么從 0 重置索引呢?Pandas 提供的 reset_index() 函數(shù)會(huì)直接使用重置后的索引。如下所示:

import pandas as pd

data={
   
    'A':[1,3,3,3],
    'B':[0,1,2,0],
    'C':[4,5,4,4],
    'D':[3,3,3,3]
}
df=pd.DataFrame(data=data)
#去除所有重復(fù)項(xiàng),對(duì)于B來說兩個(gè)0是重復(fù)項(xiàng)
df=df.drop_duplicates(subset=['B'],keep=False)
#重置索引,從0重新開始
df.reset_index(drop=True)

輸出結(jié)果:

  A B C D
0 3 1 5 3
1 3 2 4 3

4) 指定多列同時(shí)去重

創(chuàng)建一個(gè) DataFrame 對(duì)象,如下所示:

import numpy as np
import pandas as pd
df = pd.DataFrame({'Country ID':[1,1,2,12,34,23,45,34,23,12,2,3,4,1],
                    'Age':[12,12,15,18, 19, 25, 21, 25, 25, 18, 25,12,32,18],
                   'Group ID':['a','z','c','a','b','s','d','a','b','s','a','d','a','f']})
#last只保留最后一個(gè)重復(fù)項(xiàng)
df.drop_duplicates(['Age','Group ID'],keep='last')

輸出結(jié)果:

  Country ID Age Group ID
0   1         12      a
1   1         12      z
2   2         15      c
3   3         18      a
4   4         19      b
5   3         25      s
6   4         21      d
8   2         25      b
9   1         18      s
10  2         25      a
11  3         12      d
12  4         32      a
13  1         18      f

上述數(shù)據(jù)集中,第 7 行、第 10 行對(duì)應(yīng)的列標(biāo)簽數(shù)據(jù)相同,我們使用參數(shù)值“l(fā)ast”保留最后一個(gè)重復(fù)項(xiàng),也就是第 10 行數(shù)據(jù)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)