데이터를 분석하는 동안 데이터를 바로 삭제하는 대신 중복 행을 살펴보고 데이터에 대해 더 많이 이해해야 하는 경우가 있습니다.
운 좋게도 pandas에서는 복제본을 처리할 수 있는 방법이 거의 없습니다.
.dupliated()
이 방법을 사용하면 DataFrame에서 중복 행을 추출할 수 있습니다. 중복이 있는 새 데이터 세트를 사용합니다. 링크에서 Hr Dataset을 다운로드했습니다.
import pandas as pd import numpy as np # Import HR Dataset with certain columns df = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/HRDataset.csv", usecols = ("Employee_Name""PerformanceScore","Position","CitizenDesc")) #Sort the values on employee name and make it permanent df.sort_values("Employee_Name"inplace = True) df.head(3)
직원 이름 | 위치 | 시민설명 | 실적 점수 | |
---|---|---|---|---|
0 | 아디놀피 | 생산 기술자 I | 미국 시민 | 초과 |
1 | 아디놀피 | 선생님. DBA | 미국 시민 | 완전히 만나다 |
2 | 아디놀피 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
기본적으로 duplicated()가 작동하는 방식은 매개변수를 유지하는 것입니다. 이 매개변수는 각 값이 중복되지 않는 것으로 가장 먼저 나타나는 것을 표시합니다.
이 방법은 행이 두 번 이상 존재하는 경우 중복으로 표시하지 않고 첫 번째 행 이후의 각 후속 행을 중복으로 표시합니다. 혼란스러운? 예를 들어 한 번 더 설명하겠습니다. 바구니에 3개의 사과가 있다고 가정해 보겠습니다. 이 방법은 첫 번째 사과를 중복되지 않은 것으로 표시하고 나머지 두 개의 사과를 중복된 것으로 표시하는 것입니다.
예시
df["Employee_Name"].head(3)
출력
0 Adinolfi 1 Adinolfi 2 Adinolfi Name: Employee_Name, dtype: object
예시
df["Employee_Name"].duplicated().head(3)
출력
0 False 1 True 2 True Name: Employee_Name, dtype: bool
이제 중복 항목을 추출하려면(첫 번째 항목이 중복 항목이 아니라 하위 시퀀스 항목이 중복 항목이며 이 방법으로 출력된다는 것을 기억하십시오) 이 방법을 데이터 프레임에 전달해야 합니다.
df.shape
(310, 4)
df[df["Employee_Name"].duplicated()]
직원 이름 | 위치 | 시민설명 | 실적 점수 | |
---|---|---|---|---|
1 | 아디놀피 | 선생님. DBA | 미국 시민 | 완전히 만나다 |
2 | 아디놀피 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
3 | 아디놀피 | 생산 기술자 I | 미국 시민 | 완전히 만나다 |
4 | 아디놀피 | 프로덕션 매니저 | 미국 시민 | 완전히 만나다 |
6 | 앤더슨 | 생산 기술자 I | 미국 시민 | 초과 | ... | ... | ... | ... |
303 | 왕 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
304 | 왕 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
305 | 왕 | 생산 기술자 I | 미국 시민 | PIP |
306 | 왕 | CIO | 미국 시민 | 초과 |
307 | 왕 | 데이터 분석가 | 미국 시민 | 완전히 만나다 |
79행 × 4열
위의 출력에서 .duplicated() 메서드를 사용하여 추출된 79개의 중복 행이 있는 310개의 행이 있습니다.
인수-"마지막"
기본적으로 이 메서드는 값이 중복되지 않은 첫 번째 항목을 표시합니다. keep =last 인수를 전달하여 이 동작을 변경할 수 있습니다.
이 매개변수는 처음 두 사과를 중복으로 표시하고 마지막 사과는 중복되지 않음으로 표시합니다.
df[df["Employee_Name"].duplicated(keep="last")]
직원 이름 | 위치 | 시민설명 | 실적 점수 | |
---|---|---|---|---|
0 | 아디놀피 | 생산 기술자 I | 미국 시민 | 초과 |
1 | 아디놀피 | 선생님. DBA | 미국 시민 | 완전히 만나다 |
2 | 아디놀피 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
3 | 아디놀피 | 생산 기술자 I | 미국 시민 | 완전히 만나다 |
5 | 앤더슨 | 생산 기술자 I | 미국 시민 | 완전히 만나다 | ... | ... | ... | ... |
302 | 왕 | 생산 기술자 II | 미국 시민 | 초과 |
303 | 왕 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
304 | 왕 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
305 | 왕 | 생산 기술자 I | 미국 시민 | PIP |
306 | 왕 | CIO | 미국 시민 | 초과 |
인수 - 거짓
keep 매개변수는 또한 두 번 이상 발생하는 모든 값을 중복으로 표시하는 추가 인수 "false"를 허용합니다. 이 경우 위의 예에 표시된 것처럼 3개의 사과가 모두 첫 번째 또는 마지막이 아닌 중복으로 표시됩니다.
참고 – false 매개변수를 지정할 때 따옴표를 사용하지 마십시오.
df[df"Employee_Name"].duplicated(keep=False)]
직원 이름 | 위치 | 시민설명 | 실적 점수 | |
---|---|---|---|---|
0 | 아디놀피 | 생산 기술자 I | 미국 시민 | 초과 |
1 | 아디놀피 | 선생님. DBA | 미국 시민 | 완전히 만나다 |
2 | 아디놀피 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
3 | 아디놀피 | 생산 기술자 I | 미국 시민 | 완전히 만나다 |
4 | 아디놀피 | 프로덕션 매니저 | 미국 시민 | 완전히 만나다 | ... | ... | ... | ... |
303 | 왕 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
304 | 왕 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
305 | 왕 | 생산 기술자 I | 미국 시민 | PIP |
306 | 왕 | CIO | 미국 시민 | 초과 |
307 | 왕 | 데이터 분석가 | 미국 시민 | 완전히 만나다 |
이제 마지막으로 데이터 세트에서 고유한 값을 추출하기 위해 "~"(틸다) 기호를 사용하여 값을 무효화할 수 있습니다.
df_unique~df["Employee_Name"].duplicated(keep=False)df[df_unique]
직원 이름 | 위치 | 시민설명 | 실적 점수 | |
---|---|---|---|---|
7 | 안드레아 | 소프트웨어 엔지니어 | 미국 시민 | 완전히 만나다 |
25 | 보지 | 프로덕션 매니저 | 미국 시민 | 완전히 만나다 |
26 | 브라만테 | 운영 이사 | 미국 시민 | 초과 |
27 | 브릴 | 생산 기술자 I | 미국 시민 | 완전히 만나다 |
34 | 버켓 | 생산 기술자 II | 미국 시민 | 완전히 만나다 | ... | ... | ... | ... |
276 | 스위트워터 | 소프트웨어 엔지니어 | 미국 시민 | 초과 |
277 | 자보 | 생산 기술자 I | 비시민권자 | 완전히 만나다 |
278 | 타바레스 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
308 | 저우 | 생산 기술자 I | 미국 시민 | 완전히 만나다 |
309 | 지마 | 난 | 난 | 난 |
drop_duplicates()
이 방법은 이전 방법과 매우 유사하지만 이 방법은 단일 시리즈가 아닌 DataFrame에 있을 수 있습니다.
참고:- 이 방법은 DataFrame의 모든 열에서 중복 행을 찾아 삭제합니다.
len(df)
출력
310
len(df.drop_duplicates())
출력
290
하위 매개변수
부분집합 매개변수는 열 이름 목록을 중복 여부를 확인할 수 있는 문자열 값으로 허용합니다.
df1=df.drop_duplicates(subset=["Employee_Name"],keep="first")df1
직원 이름 | 위치 | 시민설명 | 실적 점수 | |
---|---|---|---|---|
0 | 아디놀피 | 생산 기술자 I | 미국 시민 | 초과 |
5 | 앤더슨 | 생산 기술자 I | 미국 시민 | 완전히 만나다 |
7 | 안드레아 | 소프트웨어 엔지니어 | 미국 시민 | 완전히 만나다 |
14 | 아스왈 | 생산 기술자 I | 미국 시민 | 완전히 만나다 |
20 | 부리 | 생산 기술자 I | 미국 시민 | 완전히 만나다 | ... | ... | ... | ... |
293 | 본 마센바흐 | 생산 기술자 II | 미국 시민 | 완전히 만나다 |
295 | 월레스 | 생산 기술자 I | 미국 시민 | 개선 필요 |
300 | 왕 | 생산 기술자 I | 자격이 있는 비시민권자 | 완전히 만나다 |
308 | 저우 | 생산 기술자 I | 미국 시민 | 완전히 만나다 |
309 | 지마 | 난 | 난 | 난 |
여러 열을 지정하고 이전 섹션에서 설명한 모든 유지 매개변수를 사용할 수 있습니다.
df1=df.drop_duplicates(subset="Employee_Name""CitizenDesc"],keep=False)df1
직원 이름 | 위치 | 시민설명 | 실적 점수 | |
---|---|---|---|---|
7 | 안드레아 | 소프트웨어 엔지니어 | 미국 시민 | 완전히 만나다 |
16 | 부리 | 생산 기술자 I | 자격이 있는 비시민권자 | 완전히 만나다 |
25 | 보지 | 프로덕션 매니저 | 미국 시민 | 완전히 만나다 |
26 | 브라만테 | 운영 이사 | 미국 시민 | 초과 |
27 | 브릴 | 생산 기술자 I | 미국 시민 | 완전히 만나다 | ... | ... | ... | ... |
287 | 테제다 | 네트워크 엔지니어 | 자격이 있는 비시민권자 | 완전히 만나다 |
286 | 테제다 | 소프트웨어 엔지니어 | 비시민권자 | 완전히 만나다 |
300 | 왕 | 생산 기술자 I | 자격이 있는 비시민권자 | 완전히 만나다 |
308 | 저우 | 생산 기술자 I | 미국 시민 | 완전히 만나다 |
309 | 지마 | 난 | 난 | 난 |
고유() 메소드
고유한 메서드는 시리즈에서 고유한 값을 찾고 고유한 값을 배열로 반환합니다. 이 방법은 누락된 값을 제외하지 않습니다.
len(df["Employee_Name"])
출력
310
df["Employee_Name"].unique()
array(['Adinolfi', 'Anderson', 'Andreola', 'Athwal', 'Beak', 'Bondwell', 'Bozzi', 'Bramante', 'Brill', 'Brown', 'Burkett', 'Butler', 'Carabbio', 'Carey', 'Carr', 'Carter', 'Chace', 'Champaigne', 'Chan', 'Chang', 'Chivukula', 'Cierpiszewski', 'Cisco', 'Clayton', 'Cloninger', 'Close', 'Clukey', 'Cockel', 'Cole', 'Cornett', 'Costa', 'Crimmings', 'Daneault', 'Daniele', 'Darson', 'Davis', 'DeGweck', 'Del Bosque', 'Demita', 'Desimone', 'DiNocco', 'Dickinson', 'Dietrich', 'Digitale', 'Dobrin', 'Dolan', 'Dougall', 'Dunn', 'Eaton', 'Employee_Name', 'Engdahl', 'England', 'Erilus', 'Estremera', 'Evensen', 'Exantus', 'Faller', 'Fancett', 'Favis', 'Ferguson', 'Fernandes', 'Ferreira', 'Fidelia', 'Fitzpatrick', 'Foreman', 'Foss', 'Foster-Baker', 'Fraval', 'Friedman', 'Galia', 'Garcia', 'Garneau', 'Gaul', 'Gentry', 'Gerke', 'Gill', 'Gonzales', 'Gonzalez', 'Good', 'Handschiegl', 'Hankard', 'Harrison', 'Heitzman', 'Horton', 'Houlihan', 'Howard', 'Hubert', 'Hunts', 'Hutter', 'Huynh', 'Immediato', 'Ivey', 'Jackson', 'Jacobi', 'Jeannite', 'Jeremy Prater', 'Jhaveri', 'Johnson', 'Johnston', 'Jung', 'Kampew', 'Keatts', 'Khemmich', 'King', 'Kinsella', 'Kirill', 'Knapp', 'Kretschmer', 'LaRotonda', 'Lajiri', 'Langford', 'Langton', 'Latif', 'Le', 'LeBel', 'LeBlanc', 'Leach', 'Leruth', 'Liebig', 'Linares', 'Linden', 'Lindsay', 'Lundy', 'Lunquist', 'Lydon', 'Lynch', 'MacLennan', 'Mahoney', 'Manchester', 'Mancuso', 'Mangal', 'Martin', 'Martins', 'Maurice', 'McCarthy', 'McKinzie', 'Mckenna', 'Meads', 'Medeiros', 'Merlos', 'Miller', 'Monkfish', 'Monroe', 'Monterro', 'Moran', 'Morway', 'Motlagh', 'Moumanil', 'Mullaney', 'Murray', 'Navathe', 'Ndzi', 'Newman', 'Ngodup', 'Nguyen', 'Nowlan', 'O'hare', 'Oliver', 'Onque', 'Osturnka', 'Owad', 'Ozark', 'Panjwani', 'Patronick', 'Pearson', 'Pelech', 'Pelletier', 'Perry', 'Peters', 'Peterson', 'Petingill', 'Petrowsky', 'Pham', 'Pitt', 'Potts', 'Power', 'Punjabhi', 'Purinton', 'Quinn', 'Rachael', 'Rarrick', 'Rhoads', 'Riordan', 'Rivera', 'Roberson', 'Robertson', 'Robinson', 'Roby', 'Roehrich', 'Rogers', 'Roper', 'Rose', 'Rossetti', 'Roup', 'Ruiz', 'Saada', 'Saar-Beckles', 'Sadki', 'Sahoo', 'Salter', 'Sander', 'Semizoglou', 'Sewkumar', 'Shepard', 'Shields', 'Simard', 'Singh', 'Sloan', 'Smith', 'Soto', 'South', 'Sparks', 'Spirea', 'Squatrito', 'Stanford', 'Stanley', 'Steans', 'Stoica', 'Strong', 'Sullivan', 'Sutwell', 'Sweetwater', 'Szabo', 'Tavares', 'Tejeda', 'Veera', 'Von Massenbach', 'Wallace', 'Wang', 'Zhou', 'Zima'], dtype=object)
len(df["Employee_Name"].unique())
출력
231
.nunique() 메소드
이 메서드는 시리즈에서 고유한 값의 수를 반환합니다. 이 방법은 기본적으로 dropna =True 매개변수를 사용하여 누락된 값을 제외합니다.
누락된 값을 삭제하지 않도록 False 인수를 dropna 매개변수에 전달할 수 있습니다.
df["Employee_Name"].nunique()
출력
231
df["Employee_Name"].nunique(dropna=False)
출력
231