본문 바로가기
Python/Pandas

[Python 기초] 데이터 프레임 중복값 제거: drop_duplicate 예제와 사용법

by 모두의 케빈 2022. 11. 21.

안녕하세요. 모두의 케빈입니다.

오늘은 데이터 프레임에서 중복된 값을 제거하는 drop_duplicate() 메소드에 대해 알아보겠습니다.

 

글쓴이의 경험: 언제 사용하는가? 

 

파이썬을 현업에서 사용하면, 종종 엑셀의 VLOOKUP과 같은 기능이 필요한 경우가 있습니다. 다양한 방법이 있겠지만, 저 같은 경우에는 index 설정과 loc을 자주 활용합니다.

import pandas as pd

df1 = pd.DataFrame({"사번":[1111,2222,3333,4444],
                     "이름":["홍길동","김철수","박영수","이영자"]})

df2 = pd.DataFrame({"사번":[1111,2222,2222,3333,4444],
                    "집계대상":["집계대상","집계대상","집계대상","제외대상","제외대상"],
                    "비고":["현역_4시간","현역_4시간","현역_8시간","현역_4시간","현역_4시간"]})

 

set_index()와 loc()을 활용하여 df1의 3번째 열로 df2의 집계 대상 열을 추가해보겠습니다.

df2.set_index("사번", inplace=True)

# df1에 "집계대상" 열 추가
df1["집계대상"] = None

# VLOOKUP처럼 값 채우기
for i in range(len(df1)):
    df1.loc[i,"집계대상"] = df2.loc[df1.loc[i,"사번"], "비고"]
    
df1

이 경우, 아래와 같은 에러가 발생합니다.

왜 이런 에러가 발생했는지, 코드를 점검해보겠습니다.

df2.loc[df1.loc[i,"사번"], "비고"]

# === 아래는 결과값 ===
사번
2222    현역_4시간
2222    현역_8시간
Name: 비고, dtype: object
# =====================

 

 

 

 

 

df2의 "사번" 열을 index로 설정했지만, 중복 값이 있어서 index를 기준으로 loc를 하면 여러 값이 Series로 반환되기 때문에 발생하는 에러였습니다. 이 경우, df2 사번의 중복 값을 제거해주고 다시 index로 설정하면 해결됩니다.

 

중복 값 제거: drop_duplicates()  

 

df2의 index를 reset 하고 중복 값을 제거해보겠습니다.

# index reset
df2.reset_index(inplace = True)

df2.drop_duplicates()

 

 

 

 

 

값이 하나도 바뀌지 않았습니다. 왜 그럴까요?

drop_duplicates() 메소드에 아무것도 입력하지 않으면, 데이터 프레임의 모든 열의 값을 하나의 값으로 생각하고 중복 값을 찾습니다. [사번, 집계대상, 비고]의 모든 값이 동일해야만 중복 값으로 생각한다는 의미입니다.

그래서 중복 값 확인이 필요한 열을 직접 지정해보겠습니다.

df2.drop_duplicates(["사번"])

 

 

 

 

[참고 #1] 여러 열을 동시에 입력할 수 있습니다.

df2.drop_duplicates(["사번", "집계대상"])

 

[참고 #2] 중복 값 중, 남길 값을 선택할 수 있습니다. 

# 가장 첫 번째 값만 남기기
df2.drop_duplicates(["사번"], keep = "first")

 

 

 

 

# 가장 마지막 값만 남기기
df2.drop_duplicates(["사번"], keep = "last")

 

 

 

 

[참고 #3] 중복되는 모든 값을 제거할 수 있습니다. 

# 중복되는 모든 값 제거
df2.drop_duplicates(["사번"], keep = False)

 

 

 

 

[참고 #4] 제거된 후, 기존의 index를 초기화할 수 있습니다.

# 중복값 모두 제거 후, index 초기화
df2.drop_duplicates(["사번"], keep = False, ignore_index = True)

 

 

 

 

다시 df1에 df2 열 값 추가(VLOOKUP) 진행

 

df2의 중복 값을 제거하고 다시 사번 열을 index로 설정하겠습니다.

df2.drop_duplicates(["사번"], keep = 'first', ignore_index = True, inplace = True)
df2.set_index("사번", inplace=True)
df2

 

 

 

 

이제 에러가 발생했던 위의 코드를 다시 가져와 보겠습니다.

# df1에 "집계대상" 열 추가
df1["집계대상"] = None

# VLOOKUP처럼 값 채우기
for i in range(len(df1)):
    df1.loc[i,"집계대상"] = df2.loc[df1.loc[i,"사번"], "비고"]
    
df1

 

 

 

 

df1의 사번 값을 활용하여 df2의 집계대상 열의 값을 잘 불러왔음을 확인할 수 있습니다.

 

긴 글 읽어주셔서 감사합니다. 궁금하신 점은 댓글 남겨주세요. :)

 

댓글