Data/Pandas

Q. 데이터프레임에 중복값이 있는지 확인하려면? A. pandas.DataFrame.duplicated

makeitworth 2022. 10. 6. 14:27

다큐멘테이션 : https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.duplicated.html

 

Q. 

표와 데이터가 있다. 그런데 중복이면 안되는 열 있거나, (ex. 생일이 똑같은 유저는 얼마든지 있어도 상관없는데, 전화번호가 똑같으면 안된다.) 입력할 때 오류가 있어서 모든 내용이 완전히 중복된 행이 있는 것 같은데 확인하기 어려울 때, 아니면, 모든 열의 값에 겹치는 것이 하나도 없는 행들만 남기고 싶을 땐 어떻게 해야할까?

 

 

A.

표를 판다스 데이터프레임으로 만들어 해결한다.

pandas.DataFrame.duplicated() 는 중복인 row가 있으면, True를 반환해주는데, 이를 몇가지 상황에서 활용할 수 있다.

 

1. 특정 컬럼이 중복인 row가 있는지 확인하고 싶을 때, (ex. unique_key 값이 중복인 row가 있는지 확인이 필요할 때)

df[df.duplicated(subset=컬럼_리스트, keep=False)]

 

파라미터에 keep=False 라고 하면 subset 컬럼에 중복값이 있는 모든 row를 확인할 수 있다.

subset 파라미터를 주지 않는다면, 모든 column의 값이 같은 row 들만, 즉 완전히 중복인 row만 보여준다.

 

 

2. 중복인 값이 있는 row는 제외하고 전체 df를 보고 싶을 때 ('first'이면 중복값이 등장하는 첫번째 row가 남고, 'last'는 마지막 row가 남음)

pandas.DataFrame.duplicated()는 중복값이 있을 때 True를 반환하기 때문에 중복값이 있는 행이 여러 개라면, 여러 개를 모두 반환해 버린다. 중복값이 없는 row 하나씩만 남긴 표를 보고 싶다면,  

df[~df.duplicated(subset=파일_리스트, keep='first' or 'last')]

True와 False를 바꿔주는 ~(tilde) 기호를 붙여서 false값이 반환된 row만을 볼 수 있게 바꿔준다. 만약 keep 파라미터를 'first'라고 했다면, 원래 중복값이 있는 row 중에 첫번 째 row를 false라고 반환했을 것이기 때문에, 첫번 째 row들을 보여줄 것이고, 'last'라고 했다면, 중복값이 있는 행들 중에서 인덱스가 가장 마지막인 row를 보여주게 될 것이다. 원래 keep 파라미터의 default 값이 'first'이기 때문에, 처음과 마지막 row 중에 어떤 것이 남든 상관없다거나 첫번 째 row 만 보고 싶다면, 그냥 keep 파라미터를 넣지 않아도 된다.

 

pandas.DataFrame.drop_duplicates()를 사용하면, 아예 중복값이 있는 row를 제외하고 보여주기에, 1번을 사용할 때가 더 많은 편이다.