본문 바로가기
Development/Python

[Python] drop_duplicates 안되는 문제 해결 (Index는 같지만 Value가 다를 경우)

by 성딱이 2022. 7. 4.
반응형

 

0. 증상

판다스의 DataFrame에 대해서 drop_duplicates를 수행했음에도 불구하고 다음과 같이 중복된 Index가 제거되지 않는 경우가 있다. (Index가 날짜인 시계열 데이터를 다룰 경우 주로 발생)

exam_df.drop_duplicates()

 

  A B
2022-06-01 1 a
2022-06-02 2 b
2022-06-03 3 c
2022-06-01 1 b
2022-06-02 2 c

 

준비

import pandas as pd

date = ['2022-06-01', '2022-06-02', '2022-06-03', '2022-06-01', '2022-06-02']
A = ['1','2','3','1','2']
B = ['a','b','c','b','c']
exam_df = pd.DataFrame({
    'A' : A
    , 'B' : B
}, index=date)

 

1. 원인

*** 여러 컬럼으로 이뤄진 데이터프레임의 중복된 Index에 대해서 Value들이 다른 경우, drop_duplicates를 수행해줘도 중복된 인덱스가 제거 되지 않는다. 즉, Index와 Value 모두 다 중복된 값으로 구성이 되어야만 drop_duplicates가 수행된다.

  A B
2022-06-01 1 a
2022-06-02 2 b
2022-06-03 3 c
2022-06-01 1 b
2022-06-02 2 c

앞의 예시를 살펴보면 2022년 6월 1일의 데이터에 대해서 2개의 row가 있다.

6월1일 1번째 row의 값은 1과 a 이고, 

6월1일 2번째 row의 값은 1과 b 이다. ->  'B' 컬럼에 대해서 다른 값을 가지고 있다.

6월2일 1번째 row의 값은 2와 b 이고,

6월2일 1번째 row의 값은 2와 c 이다. ->  'B' 컬럼에 대해서 다른 값을 가지고 있다.

 

따라서, 다음의 예시 데이터프레임에 대해서 drop_duplicates를 수행해도 중복된 인덱스의 제거효과를 볼 수 없다.

 

2. 해결
exam_df.loc[~exam_df.index.duplicated(keep='first')]

 

  A B
2022-06-01 1 a
2022-06-02 2 b
2022-06-03 3 c

Value가 다름에도 불구하고 Index를 기준으로 중복제거를 하고 싶다면, 위의 코드와 같이 중복된 Index를 명시하여 제외하고 선택할 수 있다. 원리는 DataFrame의 각 row에 해당하는 인덱스가 중복되어 있는지 논리 값(True, False)로 확인을 한 후, 조건에 맞는 row에 대해서만 DataFrame을 불러오는 것이다.(참고)

 

 

**** 추가적인 해결 방법

2.2. 편법
# 1) Reset Index
exam_df = exam_df.reset_index()

# 2) Drop Duplicates (중복을 확인 할 subset 지정)
exam_df.drop_duplicates(subset=['index'])

 

  A B
2022-06-01 1 a
2022-06-02 2 b
2022-06-03 3 c

인덱스를 리셋 후, subset으로 컬럼이 된 인덱스를 지정하여 drop_duplicates를 수행하면 원하는 결과를 똑같이 얻을 수 있다.

 

 

이상으로 성딱이의 쉽다쉬워 파이썬 중복제거 였습니다~

 

 

도움 되셨다면 좋아요와 댓글 한번씩 부탁드려요!

 

 

반응형

댓글