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