본문 바로가기

Basic/[Pytohn] Numpy, Pandas

[pandas] 중복값 제거_duplicated() , drop_duplicates()

데이터를 정제하고 살펴보는 과정에서, 중복값이 있는지 확인하고 있다면 제거해야한다.

이 때 사용하는 duplicated()drop_duplicates() 함수를 살펴보자

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.duplicated.html

 

pandas.DataFrame.duplicated — pandas 1.5.3 documentation

Only consider certain columns for identifying duplicates, by default use all of the columns.

pandas.pydata.org

 

 

간단한 데이터셋을 만들어준다. chatGPT한테 물어보면 안되는게 없는 세상이다.

 

 

import pandas as pd

data = {'name': ['John', 'Mary', 'Sara', 'John', 'David', 'Mary'],
        'age': [25, 30, 35, 25, 40, 30],
        'city': ['New York', 'San Francisco', 'Boston', 'New York', 'Chicago', 'San Francisco']}

df = pd.DataFrame(data)
df

 

duplicated()를 바로 적용해주면, 중복값인지 아닌지 bool값을 반환해준다.

df.duplicated()

여기서 한 가지 확인할 것은 중복값인 경우, 처음 값은 False를 반환하지만(이전에 중복이 없었으니까), 두 번째 중복된 값부터 True를 반환한다는 것이다.

 

 

중복값인 행을 확인하기 위해서는 간단하게 df[   ]를 씌워주면 된다. 그러면 기본적으로 True인 행들만 반환해준다.

df[df.duplicated()]

 

duplicated() 내 몇가지 parameter를 설정해 줄 수 있는데, 알아두면 유용하다.

1) subset : 해당 column만을 기준으로 중복값 여부를 파악한다.

df.duplicated(subset=['name'])

2) keep = {'first', 'last', False} (default : first)

- first : 처음 등장하는 값 제외하고 이후의 값은 중복값이 된다

- last : 마지막 등장하는 값을 제외하고 위의 값은 중복값이 된다

- False : 중복값이면 모두 True를 반환한다

df[df.duplicated(keep = False)]

중복인 모든 행을 출력

 

 

위의 데이터셋처럼 중복값이 얼마 없으면, 0번째 ,3번째 행이 중복값이고, 1번 ,5번행이 중복값이라는걸 금방 알 수 있지만 중복값이 많은 경우 한번에 파악하기 어려울 수 있다. 이 때는, sort_values를 활용해서 정렬해주면 유용하다.

df[df.duplicated(keep = False)].sort_values(by = list(df.columns))

중복값들이 붙어서 출력되는 것을 확인할 수 있다.

 

 

 

 

 

중복값을 제거하기 위해서는 drop_duplicates()를 활용한다. 

여러 함수에서 반복되는 일이지만 'inplace = True' 로 중복값 제거한 결과를 저장하거나 새로운 변수에 저장해주어야 결과가 반영된다.

# df = df.drop_duplicates()
df.drop_duplicates(inplace = True)
df

 

알아두면 유용한 parameter 역시 duplicated()와 거의 동일하다

1) subset : 위와 동일

2) keep : 위와 동일 

3) inplace : 결과 저장하려면 inplace = True

4) ignore_index : True하면 인덱스 초기화

     -> ignore_index를 해주지 않으면 위와 같이 중복값을 제거하고 실행했을 때 인덱스 순서가 엉망진창이다.