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를 수행하면 원하는 결과를 똑같이 얻을 수 있다.
이상으로 성딱이의 쉽다쉬워 파이썬 중복제거 였습니다~
도움 되셨다면 좋아요와 댓글 한번씩 부탁드려요!
댓글