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