[Pandas] 데이터프레임 중복행 제거하기(drop_duplicates)

반응형
반응형

데이터프레임 중복행 제거하는 방법입니다.

이전 포스팅에서 컬럼이 같은 경우에서 중복데이터 병합하기 포스팅을 작성했었는데요. 그 내용 중에서 중복행 제거하는 방법을 언급했었습니다. 그렇지만 데이터 병합에 초점으로 쓴 글이라서 생략된 것이 꽤 있었습니다. 이번 포스팅에서는 drop_duplicates 그 자체에 초점을 맞출까 합니다.

 

중복행 제거하기

중복행을 제거하려면 drop_duplicates() 밖에 쓸 게 없습니다.
파라미터는 다음과 같습니다. 함수 실행 후 Return은 중복행 제거 후 데이터프레임으로 나타납니다.

routeros
DataFrame.drop_duplicates(subset=None, *, keep='first', inplace=False, ignore_index=False)
  • subset : column label or sequence of labels
    • 해당 컬럼 기준으로 중복행 제거. 아무것도 쓰지 않으면 모든 컬럼을 기준으로 중복행 제거
  • keep : {'fisrt','last',False}
    • 디폴트 값은 first
    • first : 첫번째에 위치한 것 빼고 다 지운다
    • last : 마지막에 위치한 것 빼고 다 지운다
    • False : 모두 다 지운다.
  • inplace : True, False
    • 디폴트 False
    • True시 기존 데이터프레임에 반영된다.
  • ignore_index : True, False
    • 디폴트 False
    • True시 인덱스 재구성(0,1,...,n-1)

 

예를 보면 다음과 같습니다.
머신러닝 연습 데이터로 많이 쓰이는 iris 데이터로 해보겠습니다.

ebnf
iris

petal width (cm) 컬럼에서 같은 값을 제거하겠습니다.

reasonml
iris.drop_duplicates('petal width (cm)')

keep의 디폴트값이 first이기 때문에 앞에 인덱스값들을 보면 중복행중에서 가장 앞에 있는 값 빼고는 다 지워집니다.

맨 뒤에 값을 남기고 싶다면 last를 입력합니다.

reasonml
iris.drop_duplicates('petal width (cm)',keep='last')

first와 last의 0.2 를 비교해보면 인덱스 번호가 다른 걸 볼 수 있습니다.
0번이 맨 처음이었고 49번이 맨 마지막이었습니다.

중복데이터를 모두 지우고 싶다면 False를 입력합니다.

reasonml
iris.drop_duplicates('petal width (cm)',keep=False)

모두 지워지고 2개의 행만 남았습니다.

2개 이상의 컬럼 비교해 중복행 제거

비교 대상이 2개 이상의 컬럼일 때
즉, A와 B 컬럼의 모두 같은 값을 갖는 경우일 때는 컬럼을 리스트로 작성해주면 됩니다.

routeros
iris.drop_duplicates(['petal width (cm)','sepal length (cm)'],keep='last')

인덱스 리셋

중복행을 지우고 나서 인덱스를 재구성하지 않으면 loc를 쓸 때 애를 먹습니다.
만약 중복행을 지운 데이터프레임을 계속 써야한다면 인덱스를 리셋하는 습관을 기르는 게 좋습니다.
ignore_index = True 일 경우에는 reset_index와 같은 효과로 인덱스를 재구성합니다. 데이터프레임을 완성한 후 reset_index(drop=True) 를 해도 됩니다.

sas
iris.drop_duplicates(['petal width (cm)','sepal length (cm)'],keep='last',ignore_index=True) # 또는 reset_index(drop=True) iris.drop_duplicates(['petal width (cm)','sepal length (cm)'],keep='last').reset_index(drop=True)

마치며

중복행 제거한 데이터프레임경우 기존 데이터프레임에 반영되지 않습니다.
기존 데이터프레임을 중복데이터 없는 데이터프레임으로 바꾸고 싶다면 inplace=True 를 꼭 넣어주거나 =를 써서 다시 정의하시길 바랍니다.

 

관련 포스팅

[Pandas] 중복데이터 병합하기(column이 모두 같은 경우)

댓글

데이터목장님의
글이 좋았다면 응원을 보내주세요!

Designed by JB FACTORY

....