Python to AI

Python - Pandas(데이터 전처리 : isna(), isnull() )

최 수빈 2024. 12. 10. 03:44

 

데이터 전처리 - 결측치 탐지와 다양한 처리 방법

 

 

결측치(Missing Value) 탐지

Pandas는 결측치를 쉽게 탐지하고 처리할 수 있는 다양한 기능 제공

 

 

isna(),  isnull()로 결측치 탐지

데이터프레임의 각 요소가 결측치인지 여부를 확인, 두 함수는 동일한 기능을 함

=> 최신 코드에서는 isna()사용권장, 호환성을 유지해야하거나 기존 코드에서 사용중이라면 isnull()사용

import pandas as pd

#예시 데이터프레임 생성
data = {
	'이름' : ['철수','영희','민수','지수'],
	'나이' : [25,30,None,35],
	'직업' : ['학생','회사원','학생',None]
}
df = pd.DataFrame(data)

#결측치 여부 확인
df.isna()

 

df.info()와 비교

 

난 사실.. 데이터 분석, 전처리할 때 걍 df.info()찍고 데이터타입이랑 결측치 어느 컬럼에 결측치 있는지만 본다.. 세세하게 어느 위치에 결측치가 있는지 알 필요가 있는 경우가 잘 없었다, ;ㅅ;.. 오히려 큰 데이터에서 대충 결측치가 있는 것 같다 싶으면 isna().sum()은 많이 씀... 또 이상치도 모두 결측으로 바꾼경우나.. 그럴 때 결측 정도 보려고 isna().sum()썼다. isna()는.... 단독으로 언제 사용하는게 좋을까...? 결측값 패턴 시각화 정도..? 

(라고 생각나는대로 적다가 실제로 Isna()단독사용 하는경우가 잇슬까.. ?isna()하고나서 바이너리인코딩 후 결측이 결과에 미치는 영향이나…. 결측값의 패턴이 target을 도출할 수 있을까? 결측값에 패턴이 있다면 의미있는 결측값인데 그 의미를 알아내려면….결측데이터 클러스터링하겠져……?  근데 원래 다 그렇게 쓰나..? 품질관리할 때 좋겠ㄴㅔ여…또 마케팅.. 이렇게 생각하는게 맞나? 내가 써본적이 있었나? 생각도와조요.. 저 언제 썼나요)
 
feedback1.
 
isna()를 단독으로 사용하는 경우는 극히 드뭄. isna().sum()을 공식처럼 사용. 활용방안에 대해서는 좋은 생각.
 
-> isna()를 활용할 수 있는 방안에 대해 더 알 수 있거나 구체적인 인사이트 도출의 방법까지의 대화는 불가했음..... 더 구체적인 질문을 하지 않았음 떠먹여주길 바람.
 
feedback2.
 
isna()를 단독으로 활용하는 방안과 관련해서 '패턴화'라는 부분에서 생각을 명확하게 전달하지 못한듯 함

그 이유
1. 이 분은 '결측 데이터'를 이미 제거하거나 대체해야할 값으로 개념이 정립되어 있다는 것을 간과하고 내 얘기를 시작함
2. '패턴화가 가능하다면'의 전제를 구두로 제시 후 이야기를 시작했는데, 이 분 이동중에 대화- 결측치의 패턴화가 가능할 만한 분야를 고민하거나 가능성을 생각하지 않고 본인의 생각(방대한 데이터에서 결측치의 패턴을 찾는 것은 불가능에 가까움이라는 결론)을 제시. 
 

상대방의 상황적 한계나 고정된 관점을 더 잘 이해하고 대화를 시작했어야 했다는 점에서 내 전달 방식에 부족함이 있었다고 생각함. 특히 전제에 대한 공감대를 형성하는 데 더 신경을 쓰거나, 상대방이 놓칠 수 있는 부분을 강조하는 방식으로 대화를 이끌어야한다는 생각을 함. 앞으로는 내 생각을 전달할 때 상대방의 이해를 돕기 위해 전제를 더 구체적으로 설명하거나, 논의를 좀 더 차근차근 이끌어 나가는 노력이 필요할 듯. 아니면 괜히 말꺼냈다가 서로 생각한다고, 말한다고 진빠지는데 걍 말을 꺼내지 말자. 혼자 고민해보자.

 

 

isna() 또는 isnull(), sum() 조합하여 결측치의 총 개수 확인

#각 열별 결측치 개수 확인
df.isna().sum()

 

 

 

 

결측치의 처리 방법은 데이터의 특성과 분석 목적에 따라 달라진다.

 

#결측치가 있는 행 제거
df_dropped_rows = df.dropna()
df_dropped_rows

#결측치가 있는 열을 제거하려면 axis = 1을 지정

#결측치가 있는 열 제거
df_dropped_columns = df.dropna(axis = 1)
df_dropped_columns

결측치 대체(채우기) - fillna()함수 사용

#결측치를 '없음'으로 대체
df_filled = df.fillna('없음')
df_filled

 

평균, 중앙값, 최빈값 등으로 결측치 채우기

#'나이'열의 결측치를 평균값으로 대체
df['나이'] = df['나이'].fillna(df['나이'].mean())
df

 

결측치 보간(Interpolation)

주변 값들을 기반으로 보간. 특히 시간 데이터를 다룰 때 유용

#예시 데이터프레임 생성
data = {
    '날짜' = pd.date_range('2023-01-01', periods = 5),
    '온도' = [20,22,None,24,25]
    }
df2 = pd.DataFrame(data)

#선형 보간법으로 결측치 채우기
df2['온도'] = df2['온도'].interpolate()
df2

고급 결측치 처리 방법

특정 조건을 기반으로 결측치 처리

예) 다른 열의 값을 기준으로 결측치를 채우는 방법

#'직업'이 '학생'인 경우 '나이'를 20으로 채우기
df.loc[(df['직업'] == '학생') & (df['나이'].isna()), '나이'] = 20
df

 

apply()사용, 사용자 정의 함수 적용

#예시 : '나이'가 결측치일 경우, 기본값으로 18을 채우는 함수
def fill_missing_age(x):
    if pd.isna(x):
        return 18
        
df['나이'] = df['나이'].apply(fill_missing_age)
df