本次來介紹重復值處理的常用方法。
重復值處理主要涉及兩個部分,一個是找出重復值,第二個是刪除重復值,也就是根據自己設定的條件進行刪除操作。
定位重復值
對于重復值,我們首先需要查看這些重復值是什么樣的形式,然后確定刪除的范圍,而查詢重復值需要用到duplicated函數。
duplicated的返回值是布爾值,返回True和False,默認情況下會按照一行的所有內容進行查重。
主要參數:
subset:如果不按照全部內容查重,那么需要指定按照哪些列進行查重。比如按照姓名進行查重subset=['name'],那么具有相同名字的人就只會保留一個,但很可能只是重名的原因,而并非真正同一個人,所以可以按照姓名和出生日期兩列查重,subset=['name','birthday'],同理還可以再添加列,這樣就可以基本保證去重效果了。
keep:用來確定要標記的重復值,可以設置為first、last、False。
first:除第一次出現的重復值,其他都標記為True
last:除最后一次出現的重復值,其他都標記為True
False:所有重復值都標記為True
實例:
importpandasaspd importnumpyasnp data={ 'user':['zszxz','zszxz','rose'], 'price':[100,200,-300], 'hobby':['reading','reading','hiking'] } frame=pd.DataFrame(data) print(frame) ------------------------ userpricehobby 0zszxz100reading 1zszxz200reading 2rose-300hiking ------------------------ frame.duplicated() ---------- 0False 1False 2False dtype:bool -----------
上面提到duplicated返回布爾值,所以如果要想輸出這些重復值,還需要和查詢的方法配合使用df[df.duplicated()],比如:
#1、按user變量篩選重復值 frame[frame.duplicated(subset=['user'])] ------------------- userpricehobby 1zszxz200reading -------------------
上面按user一個變量進行查重,但沒有設置keep參數,所以默認篩選出除了第一個以外的其它重復值。
#2、按user變量篩選重復值,保留全部重復值 frame[frame.duplicated(subset=['user'],keep=False)] ------------------- userpricehobby 0zszxz100reading 1zszxz200reading -------------------
上面按user一個變量進行查重,并設置keep參數為False,所以保留了全部的重復值。
#3、按user和hobby變量篩選重復值,篩選出除最后一個重復值以外的其它重復值 frame[frame.duplicated(subset=['user','hobby'],keep='last')] ------------------- userpricehobby 0zszxz100reading -------------------
上面按user和hobby兩個變量進行查重,并設置keep參數為last,所以篩選出了除最后一個重復值以外的其它重復值。
通過兩個參數的設置就可以查看自己想要的重復值了,以此判斷要刪除哪個,保留哪個。
刪除重復值
當確定好需要刪除的重復值后,就進行進行刪除的操作了。
刪除重復值會用到drop_duplicates函數。
和duplicated()函數參數類似,主要有3個參數:
subset:同duplicated(),設置去重的字段
keep: 這里稍有不同,duplicated()中是將除設置值以外重復值都返回True,而這里是保留的意思。同樣可以設置first、last、False
first:保留第一次出現的重復行,刪除其他重復行
last:保留最后一次出現的重復行,刪除其他重復行
False:刪除所有重復行
inplace:布爾值,默認為False,是否直接在原數據上刪除重復項或刪除重復項后返回副本。
實例:
1、全部去重
#按全部字段刪除,在原數據frame上生效 frame.drop_duplicates(inplace=True) print(frame) ------------------------ userpricehobby 0zszxz100reading 1zszxz200reading 2rose-300hiking ------------------------
因為上面數據中沒有全部重復的,因此沒有可刪除行。
2、指定列去重
#按user字段刪除,在原數據frame上生效 frame.drop_duplicates(subset=['user'],inplace=True) print(frame) ------------------------ userpricehobby 0zszxz100reading 2rose-300hiking ------------------------
上面按user字段刪除重復行,保留第一個重復行,因此第二行被刪除了。但這里大家注意下,執行刪除重復行操作后,表的索引也會被刪掉。
如需要重置可以加上reset_index(),設置drop=True,用索引替代被打亂的索引。
frame.drop_duplicates(subset=['user'],inplace=True) frame.reset_index(drop=True) ------------------------ userpricehobby 0zszxz100reading 1rose-300hiking ------------------------
keep默認為first,下面手動設置為last,只保留最后一個重復行。
#按全部字段刪除,在原數據frame上生效 frame.drop_duplicates(subset=['user','hobby'],keep='last',inplace=True) print(frame) ------------------------ userpricehobby 1zszxz200reading 2rose-300hiking ------------------------
keep手動設置為False,全部刪除,這種一般很少用。
#按全部字段刪除,在原數據frame上生效 frame.drop_duplicates(subset=['user','hobby'],keep=False,inplace=True) print(frame) ------------------------ userpricehobby 2rose-300hiking ------------------------
以上就是重復值相關的所有操作。
注意事項
在刪除重復值時,要注意下刪除的邏輯。
因為很多時候我們需要把這些離線的清洗操作在線上復現。
如果我們隨機地刪除重復行,沒有明確的邏輯,那么對于這種隨機性線上是無法復現的,即無法保證清洗后的數據一致性。
所以我們在刪除重復行前,可以把重復判斷字段進行排序處理。
比如上面例子中,如果要對user和price去重,那么比較嚴謹的做法是按照user和price進行排序。
frame.sort_values(by=['user','price'],ascending=True).reset_index(drop=True) -------------------- userpricehobby 0rose-300hiking 1zszxz100reading 2zszxz200reading --------------------
因為有了排序性,只要按這個邏輯它的順序是固定的,而不是隨機的。所以無論我們設置keep為first還是last,都沒有任何影響。
原文標題:pandas 重復數據處理大全(附代碼)
文章出處:【微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。
-
數據
+關注
關注
8文章
7002瀏覽量
88943 -
函數
+關注
關注
3文章
4327瀏覽量
62573 -
KEEP
+關注
關注
0文章
8瀏覽量
6732
原文標題:pandas 重復數據處理大全(附代碼)
文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論