brunch

You can make anything
by writing

C.S.Lewis

by 브래드 Nov 29. 2022

파이썬으로 데이터 전처리하기(9)

feat. 결측값 처리 및 중복 처리

안녕하세요, 브래드입니다.


오늘은 파이썬으로 데이터 전처리하기 아홉 번째 시간으로 pandas에서 결측값 처리 및 중복 처리하는 과정을 함께 공부해보아요.



결측값 처리

결측값

결측값자료가 입력되지 않은 값 혹은 누락된 값을 의미합니다.


실제 데이터 처리에 있어서는 결측값이 불가피하게 존재하므로, 결측값을 다루는 것이 중요합니다.


결측값은 NaN, N/A, Null, 0 등 다양한 방식으로 불립니다. 위의 예시에서는 NaN과 0으로 표시된 모습입니다.




0  →  NaN으로 변환하기

현재의 예시에서 0 값을 결측값으로 가정하고, 일괄적인 결측값 처리를 위하여 0 값을 NaN으로 변환했습니다.


df = df.replace('0', np.NaN)  




isnull로 결측값 확인

isnull()로 결측값을 확인할 수 있습니다.


df.isnull()을 출력하여 True로 반환된다면 해당 값은 Null 값임을 알 수 있습니다.




isnull과 sum

파이썬에서 True는 1로 인식하기 때문에 df.isnull().sum()을 출력하여 칼럼 별로 결측값의 개수를 파악할 수 있습니다.




결측 데이터 제거하기 dropna()

데이터 분석에 방해되는 결측값을 지우려 한다면 dropna()를 활용할 수 있습니다.


기본적으로 df.dropna()를 한다면, 결측값이 존재하는 모든 행을 삭제합니다. 따라서 분석할 데이터가 지나치게 사라지므로 주의하여 사용할 필요가 있습니다.


따라서, df.dropna(subset=['컬럼명']) 을 출력하여 해당 컬럼 내에 존재하는 결측값만 삭제시켜줄 수 있습니다. 추가적으로 여러개의 []안에 여러개의 컬럼명 입력 또한 가능합니다.


위의 예시에서는 'mm' 컬럼에 존재하는 결측값만 삭제를 실행한 모습입니다.




결측값을 지정값으로 대체하기: fillna('대체값')

결측값을 삭제하는 것이 아닌 우리가 원하는 지정값으로 대체하려면 fillna('대체값')를 사용해줄 수 있습니다.


위의 예시에서는 df['mm'] = df['mm'].fillna(3)을 입력하여 'mm이란 컬럼 내에 있는 결측값은 3으로 변환해줘'를 출력한 결과입니다.


df['컬럼명'] = df['컬럼명'].fillna(3)




결측값을 평균값으로 대체하기: fillna('평균값')

이번엔 결측값을 평균값으로 대체해주는 사례입니다.


먼저, 구해줄 컬럼의 평균값을 지정 및 구해준 후 앞서 진행했던 것처럼 fillna를 통해 결측값을 우리가 구한 평균값으로 대체해줄 수 있습니다.


1) Null_value = df['컬럼명'].mean()
2) df['컬럼명'] = df['컬럼명'].fillna(Null_value)

*Null_value는 임의로 임의로 설정한 것으로, 지정된 값이 아님




결측값을 최빈값으로 대체하기: fllna('최빈값')

결측값을 최빈값으로 대체하기 위해선, 먼저 값을 세어주는 함수인 value_counts()를 활용하여 최빈값을 알아내야 합니다.


위의 예시에서는 df['mm'].value_counts()를 통해 'mm' 컬럼에서 3.0이 가장 많이 존재하는 것을 알 수 있습니다.


이후, df['mm'].value_counts().index[0]을 출력하여 index에서 가장 첫 번째 값인 최빈값 3을 출력할 수 있습니다.


최종적으로 df['mm'] = df['mm'].fillna()의 fillna()안에 df['mm'].value_counts().index[0]을 넣어, df['mm'] = df['mm'].fillna(df['mm'].value_counts().index[0])을 출력하여 결측값 대신에 최빈값을 출력할 수 있습니다.




 

인덱스 재정렬하기: reset_index()

결측값을 제거 및 변환하면서 인덱스가 0부터 시작하는 것이 아닌, 데이터 프레임의 인덱스가 중구난방으로 바뀌는 경우를 만날 가능성이 다분합니다.


따라서, 결측값 작업을 모두 완료한 후에는 reset_index()를 통해 인덱스를 재정렬할 필요가 있습니다.


df = df.rest_index(drop=True)를 출력하여 0부터 순차적으로 데이터 프레임의 인덱스가 정렬됨을 확인할 수 있습니다. 여기서의 drop=True는 이전의 인덱스를 버린다는 의미입니다.





중복값 처리

중복 데이터 탐색: duplicated()

중복 데이터 탐색은 duplicated() 함수를 활용합니다. 


df[df.duplicated()]를 통해 행이 완전히 중복된 값을 찾을 수 있을 뿐만 아니라, df['컬럼명'].duplicated()를 출력하여 특정한 열에 중복된 값을 찾을 수도 있습니다.


위의 예시에서는 행에서는 중복된 값이 존재하지 않고, 'mm'열에서 중복된 값이 존재하는 것을 확인할 수 있습니다.




중복 데이터 제거: drop_duplicates()

drop_duplicates()를 통해 완전히 겹치는 중복된 행을 삭제할 수 있습니다.


또한, 특정 열을 기준으로 제거한다면 df.drop_duplicates(subset=['컬럼명'])을 통해 특정 열 내의 중복된 값을 제거하고 상위 값들만 남길 수 있습니다.




지금까지 파이썬으로 데이터 전처리하기 아홉 번째 시간으로 결측값 처리 및 중복 처리에 관해 함께 알아보았습니다.


가공된 raw 데이터가 아닌 현업의 데이터에서는 결측값이 다수 존재하는 경우가 많으므로 분석에 용이하게 결측값 처리와 중복 처리를 진행할 필요가 존재한다고 생각합니다.


브래드였습니다. 감사합니다.

매거진의 이전글 파이썬으로 데이터 전처리하기(8)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari