pandas 결측치 제거하는 법 ( isnull(), rest_index(), sort_value(), tolist(), drop(), dropna() )
안녕하세요!!
지난번에 이어 결측치를 조사해서 제거해보겠습니다! 여러 가지 방법이 있습니다. 이번에는 두 가지 방법에 대해 얘기해볼까 합니다
지난번에 쓰던 데이터를 불러오겠습니다
결측치를 확인하는데 isnull() 이라는 함수를 활용합니다
True / False 로 구분합니다. 여기서 주의해야하는 건 True 는 값이 없는 것입니다. unll 이라는 건 "가치가 없다" 는 의미임을 주의해야 합니다
그럼 컬럼별 개수를 확인해 보겠습니다. True 는 1 이고, False 는 0 임으로 sum() 함수를 사용합니다
이 정보를 다른 변수에 넣어줍니다. 그리고 drop() 함수를 사용하기 위해 데이터 프레임 형태로 바꿔줍니다(== 인덱스 값을 부여한다)
지금은 컬럼명이 [ "index, 0 ] 으로 돼 있는걸 내가 원하는 컬럼명으로 바꿔줍니다
그리곤 보기 편하게 정렬해줍니다. 열을 기준으로 할 땐, sort_value() 를 사용합니다. () 안에는 많은 조건들이 들어가지만, by= 즉, -에 의해 정렬하라는 기준이 들어가야 합니다. 역 정렬을 원하면 df_null_count.sort_values(by="결측치 개수", ascending=False)를 하면 됩니다.
이렇게 데이터 프레임을 가진 애들 변수에 저장합니다
여기서 만약 내가 일정 수준 이상의 결측치를 가진 애들만 가지고 오고 싶다면 어떻게 해야 할까요??
저는 20000 이상의 결측치를 가진 애들만 제거하려 합니다
이렇게 데이터 프레임으로 가져옵니다
그치만 drop() 이라는 함수를 사용하려면 컬럼명을 리스트 형태로 줘야 하게 때문에 리스트로 변환합니다. 이때 tolist() 라는 함수를 사용합니다
그리곤 drop() 을 사용합니다 열을 기준으로 삭제하기 때문에 axis = 1 을 해줍니다. 정말 삭제가 됐는지 확인하기 위해 shape 로 확인해 보겠습니다
총 6개의 열을 삭제했습니다.
두 번째 방법으로는 dropna() 를 사용합니다. 위의 방법보다 훨씬 간단합니다. 그냥 dropna() 를 하면 결측치가 하나라도 있으면 다 삭제를 합니다. 저희는 컬럼을 기준으로 삭제하기 때문에 axis = 1 를 해줍니다. 그리고 일정 수준 이상일 때 삭제라기 위해 thresh 라는 조건을 사용합니다
근데 위에는 6개의 열이 지워졌는데 dropna 를 사용하면 4개밖에 안 지워졌습니다. 그 이유는 뭘까요?? 찾아봤는데 잘 모르겠네요. 혹시 아시는 분 계시면 알려주세요!!
감사합니다