【Python】pandas 重复数据处理大全(附代码)
所有數據和代碼可在GitHub獲取:
https://github.com/xiaoyusmd/PythonDataScience
本次來介紹重復值處理的常用方法。
重復值處理主要涉及兩個部分,一個是找出重復值,第二個是刪除重復值,也就是根據自己設定的條件進行刪除操作。
定位重復值
對于重復值,我們首先需要查看這些重復值是什么樣的形式,然后確定刪除的范圍,而查詢重復值需要用到duplicated函數。
duplicated的返回值是布爾值,返回True和False,默認情況下會按照一行的所有內容進行查重。
主要參數:
subset:如果不按照全部內容查重,那么需要指定按照哪些列進行查重。比如按照姓名進行查重subset=['name'],那么具有相同名字的人就只會保留一個,但很可能只是重名的原因,而并非真正同一個人,所以可以按照姓名和出生日期兩列查重,subset=['name','birthday'],同理還可以再添加列,這樣就可以基本保證去重效果了。
keep:用來確定要標記的重復值,可以設置為first、last、False。
first:除第一次出現的重復值,其他都標記為True
last:除最后一次出現的重復值,其他都標記為True
False:所有重復值都標記為True
實例:
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返回布爾值,所以如果要想輸出這些重復值,還需要和查詢的方法配合使用df[df.duplicated()],比如:
#?1、按user變量篩選重復值 frame[frame.duplicated(subset=['user'])] -------------------user?price?hobby 1?zszxz?200?reading -------------------上面按user一個變量進行查重,但沒有設置keep參數,所以默認篩選出除了第一個以外的其它重復值。
#?2、按user變量篩選重復值,保留全部重復值 frame[frame.duplicated(subset=['user'],?keep=False)] -------------------user?price?hobby 0?zszxz?100?reading 1?zszxz?200?reading -------------------上面按user一個變量進行查重,并設置keep參數為False,所以保留了全部的重復值。
#?3、按user和hobby變量篩選重復值,篩選出除最后一個重復值以外的其它重復值 frame[frame.duplicated(subset=['user','hobby'],?keep='last')] -------------------user?price?hobby 0?zszxz?100?reading -------------------上面按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) ------------------------user??price????hobby 0??zszxz????100??reading 1??zszxz????200??reading 2???rose???-300???hiking ------------------------因為上面數據中沒有全部重復的,因此沒有可刪除行。
2、指定列去重
#?按user字段刪除,在原數據frame上生效 frame.drop_duplicates(subset=['user'],inplace=True) print(frame) ------------------------user??price????hobby 0??zszxz????100??reading 2???rose???-300???hiking ------------------------上面按user字段刪除重復行,保留第一個重復行,因此第二行被刪除了。但這里大家注意下,執行刪除重復行操作后,表的索引也會被刪掉。
如需要重置可以加上reset_index(),設置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默認為first,下面手動設置為last,只保留最后一個重復行。
#?按全部字段刪除,在原數據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手動設置為False,全部刪除,這種一般很少用。
#?按全部字段刪除,在原數據frame上生效 frame.drop_duplicates(subset=['user','hobby'],keep=False,inplace=True) print(frame) ------------------------user??price????hobby 2???rose???-300???hiking ------------------------以上就是重復值相關的所有操作。
注意事項
在刪除重復值時,要注意下刪除的邏輯。
因為很多時候我們需要把這些離線的清洗操作在線上復現。
如果我們隨機地刪除重復行,沒有明確的邏輯,那么對于這種隨機性線上是無法復現的,即無法保證清洗后的數據一致性。
所以我們在刪除重復行前,可以把重復判斷字段進行排序處理。
比如上面例子中,如果要對user和price去重,那么比較嚴謹的做法是按照user和price進行排序。
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 --------------------因為有了排序性,只要按這個邏輯它的順序是固定的,而不是隨機的。所以無論我們設置keep為first還是last,都沒有任何影響。
以上是本次分享。原創不易,歡迎點贊、在看支持。
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【Python】pandas 重复数据处理大全(附代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android app没有读写权限设置,
- 下一篇: 【Python】20个Pandas数据实