저번 포스팅이었던 결측치 처리에서는 결측치가 얼마나 있는지를 확인하는 방법과, 결측치를 처리하는 대표적인 4가지 방법에 대해 알아보았다.
이번 포스팅에선 번외편으로, 특정 열에 "결측치가 너무 많은 경우" 열을 drop(삭제)하는 방법에 관해 포스팅할 것이다.
즉, 특정 열에서 결측치의 값이 특정 개수 이상이거나, 특정 비율 이상이라면 drop시키기 위해 사용하는 방법을 알아보자.
✔Table of Contents
참고로 코드를 한번에 다운받으려면 이 깃허브 링크에서 '4. 결측치 처리' 코드를 다운받으면 됩니다 :)
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
df
저번 포스팅에서 마찬가지로 seaborn에서 제공하는 titanic 데이터셋을 활용하였다.
각 열별 결측치가 얼마나 있는지를 확인해보자.
df.isna().sum()
deck와 age 열에 결측치가 많이 존재하는 것을 확인하였다.
1. 결측치가 특정 개수 이상인 열 삭제: df.dropna(axis=1, thresh)
먼저 결측치가 특정 개수 이상인 열을 삭제하는 메서드인 dropna를 알아보자.
저번 포스팅에서도 나왔지만, 이 메서드는 axis = 0이 디폴트이기 때문에 저번 포스팅에선 행이 삭제되었다. (how 옵션이 'all', 'any'가 있었다. 기억하시죠?ㅎㅎ)
반대로 axis = 1을 쓰게 되면 열이 삭제된다.
특별한 옵션인 thresh가 있는데, 여기에 입력된 개수 이상의 데이터(비결측치)가 존재하지 않으면 그 행을 삭제하게 된다.
예를 들어, thresh = 100으로 설정할 경우, 최소한 Non-NaN은 100개여야 한다. 그래서 전체 데이터 891개 중 결측치가 791개 이상이라면 그 행을 drop시킨다.
바로 위의 예제에서 알아보자. 타이타닉 데이터에서 결측치가 많은 열을 삭제하려고 한다.
결측치가 아닌 데이터(Non-NaN)의 수가 최소한 300개 이상이어야 하고, 이를 만족하지 않으면 삭제한다고 하자.
이런 경우엔 어떤 열이 삭제될까?
df2 = df.dropna(axis = 1, thresh = 300)
print(len(df.columns), len(df2.columns))
thresh를 300으로 설정했더니 열 1개가 drop되어 14개의 열만 남았다.
df2가 어떤 열을 갖고 있는지를 살펴보면..
df2.head(3)
이렇게 'deck' 열이 없어진 것을 확인하였다.
deck 열은 NaN은 688개, Non-NaN은 203개이므로 300개 이상의 비결측치를 갖고 있지 않기 때문에 drop되었다.
2. 결측치가 특정 비율 이상인 열 삭제: 불린 인덱싱 활용
저번 포스팅에서 각 열별 결측치 비율을 확인하려면 다음 코드를 사용하면 된다고 했었다.
df.isna().sum()/len(df)
각 열별 결측치 비율을 보니, 결측치가 너무 많은 열은 drop하고 싶다고 하자.
예를 들어, 결측치 비율이 15%가 넘는 열은 버리고 싶을 때는 불린 인덱싱을 활용한다.
[df.isna().sum()/len(df) > 0.15]
먼저 이 결측치 비율이 0.15(15%)가 넘으면 True, 아니면 False로 나타내는 불린 인덱싱을 활용하였다.
여기서 우리가 원하는 결측치비율 15% 이상인 열만 뽑으면
# 15% 넘는 결측치만 갖고 있는 열들
df.columns[df.isna().sum()/len(df) > 0.15]
이렇게 2개 열인 age와 deck가 뽑힌다.
이제 이 2가지 열을 drop시키기 위해 drop 메서드를 사용하면 다음과 같다.
df.drop(columns = df.columns[df.isna().sum()/len(df) > 0.15], axis = 1)
이렇게 age와 deck 열이 삭제되었음을 확인하였다!
이러한 불린 인덱싱을 활용하면 15% 이상 결측치를 가진 열을 drop시킨 것뿐만 아니라, 반대로 특정 비율 이하의 결측치를 가진 열을 drop시키는 것도 가능하다.
반대로 결측치가 15% 미만을 갖고 있는 열만 놔두고 나머지는 모두 drop한다고 할 때에는 이렇게 하면 된다.
df.drop(columns = df.columns[df.isna().sum()/len(df) < 0.15], axis = 1)
'Skillset > Python, Git' 카테고리의 다른 글
[pandas] Series & DataFrame에서 자주 사용하는 유용한 메서드 (1) (0) | 2022.06.27 |
---|---|
파이썬 데이터프레임 인덱싱하기 - python dataframe indexing, slicing (0) | 2022.06.23 |
[pandas] 결측치 다루기 - 결측치 확인, 결측치 처리(NaN drop, interpolate) (0) | 2022.06.21 |
[pandas] 데이터 연결하기 - pd.concat, pd.merge 차이점 및 사용법 (0) | 2022.06.18 |
python 열의 문자열을 분리해 N개 열로 만드는 방법(str, split, get) (2) | 2022.06.17 |