【Python】pandas 重复数据处理大全(附代码)
所有數(shù)據(jù)和代碼可在GitHub獲取:
https://github.com/xiaoyusmd/PythonDataScience
本次來介紹重復(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í)例:
import?pandas?as?pd import?numpy?as?npdata?=?{'user'?:?['zszxz','zszxz','rose'],'price'?:?[100,?200,?-300],'hobby'?:?['reading','reading','hiking'] } frame??=?pd.DataFrame(data) print(frame) ------------------------user??price????hobby 0??zszxz????100??reading 1??zszxz????200??reading 2???rose???-300???hiking ------------------------frame.duplicated() ---------- 0????False 1????False 2????False dtype:?bool -----------上面提到duplicated返回布爾值,所以如果要想輸出這些重復(fù)值,還需要和查詢的方法配合使用df[df.duplicated()],比如:
#?1、按user變量篩選重復(fù)值 frame[frame.duplicated(subset=['user'])] -------------------user?price?hobby 1?zszxz?200?reading -------------------上面按user一個(gè)變量進(jìn)行查重,但沒有設(shè)置keep參數(shù),所以默認(rèn)篩選出除了第一個(gè)以外的其它重復(fù)值。
#?2、按user變量篩選重復(fù)值,保留全部重復(fù)值 frame[frame.duplicated(subset=['user'],?keep=False)] -------------------user?price?hobby 0?zszxz?100?reading 1?zszxz?200?reading -------------------上面按user一個(gè)變量進(jìn)行查重,并設(shè)置keep參數(shù)為False,所以保留了全部的重復(fù)值。
#?3、按user和hobby變量篩選重復(fù)值,篩選出除最后一個(gè)重復(fù)值以外的其它重復(fù)值 frame[frame.duplicated(subset=['user','hobby'],?keep='last')] -------------------user?price?hobby 0?zszxz?100?reading -------------------上面按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) ------------------------user??price????hobby 0??zszxz????100??reading 1??zszxz????200??reading 2???rose???-300???hiking ------------------------因?yàn)樯厦鏀?shù)據(jù)中沒有全部重復(fù)的,因此沒有可刪除行。
2、指定列去重
#?按user字段刪除,在原數(shù)據(jù)frame上生效 frame.drop_duplicates(subset=['user'],inplace=True) print(frame) ------------------------user??price????hobby 0??zszxz????100??reading 2???rose???-300???hiking ------------------------上面按user字段刪除重復(fù)行,保留第一個(gè)重復(fù)行,因此第二行被刪除了。但這里大家注意下,執(zhí)行刪除重復(fù)行操作后,表的索引也會(huì)被刪掉。
如需要重置可以加上reset_index(),設(shè)置drop=True,用索引替代被打亂的索引。
frame.drop_duplicates(subset=['user'],inplace=True) frame.reset_index(drop=True) ------------------------user??price????hobby 0??zszxz????100??reading 1???rose???-300???hiking ------------------------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) ------------------------user??price????hobby 1??zszxz????200??reading 2???rose???-300???hiking ------------------------keep手動(dòng)設(shè)置為False,全部刪除,這種一般很少用。
#?按全部字段刪除,在原數(shù)據(jù)frame上生效 frame.drop_duplicates(subset=['user','hobby'],keep=False,inplace=True) print(frame) ------------------------user??price????hobby 2???rose???-300???hiking ------------------------以上就是重復(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) --------------------user?price?hobby 0?rose?-300?hiking 1?zszxz?100?reading 2?zszxz?200?reading --------------------因?yàn)橛辛伺判蛐?#xff0c;只要按這個(gè)邏輯它的順序是固定的,而不是隨機(jī)的。所以無論我們?cè)O(shè)置keep為first還是last,都沒有任何影響。
以上是本次分享。原創(chuàng)不易,歡迎點(diǎn)贊、在看支持。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載(圖文+視頻)機(jī)器學(xué)習(xí)入門系列下載中國(guó)大學(xué)慕課《機(jī)器學(xué)習(xí)》(黃海廣主講)機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【Python】pandas 重复数据处理大全(附代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android app没有读写权限设置,
- 下一篇: 适合小白的卷积神经网络图解