안녕하세요. 모두의 케빈입니다.
오늘은 데이터 프레임에서 중복된 값을 제거하는 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의 집계대상 열의 값을 잘 불러왔음을 확인할 수 있습니다.
긴 글 읽어주셔서 감사합니다. 궁금하신 점은 댓글 남겨주세요. :)
'Python > Pandas' 카테고리의 다른 글
데이터 프레임에 함수 적용: map, apply, applymap 완벽 정리 (0) | 2022.11.24 |
---|---|
데이터 프레임의 행렬곱: AI의 기본 (0) | 2022.11.22 |
데이터 프레임 수정의 모든 것: 행, 열, Cell 값 추가/변경/제거 (0) | 2022.11.14 |
[2편] 데이터 프레임 살펴보기: Null 값의 처리와 제어 (0) | 2022.11.13 |
[1편] 데이터 프레임 살펴보기: head, tail, columns, values, shape, info, dtypes, describe, value_counts, unique (0) | 2022.11.10 |
댓글