Python/Pandas

[Pandas] 결측치 탐지와 처리

죵욜이 2024. 12. 26. 06:07

결측치 탐지

 

Pandas 에서 결측치를 탐지하는 기본적인 함수는  isnull()  과  notnull()  이다.

  •  isnull()  : 결측치가 있는지 확인. 결측치인 경우 True , 아닌경우 False 를 반환
  •  notnull()  : 결측치가 아닌 값을 확인. 결측치가 아닌 경우 True , 맞는경우 False  를 반환
  •  null  과  na  를 변경해  isna()  notna()  로 표현도 가능

- 예시

import pandas as pd

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

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

- 결과

     이름     나이    직업
0  False  False  False
1  False  False  False
2  False   True  False
3  False  False   True

 


Tip

True1이고 False0 인걸 활용하여 보통  sum() 함수와 같이 사용해 결측치의 개수를 편하게 확인한다.

 

- 예시

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

- 결과

이름    0
나이    1
직업    1
dtype: int64

결측치 처리

결측치 제거 -  dropna() 

  • 결측치가 포함된 행이나 열을 삭제
  •  axis =  옵션을 사용해 행 or 열 을 선택
# 결측치가 있는 행 삭제
df_dropped = df.dropna()
print(df_dropped)

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

결측치 대체 (채우기) -  fillna() 

  • 결측치를 특정 값으로 대체 할 수 있다
  • 평균, 중앙값, 최빈값 등으로 대체를 한다.
# 결측치를 0으로 채우기
df_filled = df.fillna(0)
print(df_filled)

# 결측치를 각 컬럼의 평균값으로 채우기
df_filled_mean = df.fillna(df.mean())
print(df_filled_mean)

결측치 보간 -  interpolate() 

  • 결측치를 주변 값들을 기반으로 보간 한다
  • 연속적인 데이터에서 유효, 값 간의 관계가 선형적이거나 일정한 패턴을 따를때 유용
  • 시계열 데이터와 같이 일정한 시간 간격으로 수집된 데이터에서 주로 사용

- 예시

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

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

 

-결과

         날짜    온도
0 2023-01-01  20.0
1 2023-01-02  22.0
2 2023-01-03  23.0
3 2023-01-04  24.0
4 2023-01-05  25.0

고급 결측치 처리 방법

특정 조건을 기반으로 처리

  • 특정 조건으로 결측치를 처리
  • 예를들어 다른열의 값을 기준으로 결측치를 채움

- 예시

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

 

- 결과

   이름    나이    직업
0  철수  25.0    학생
1  영희  30.0  회사원
2  민수  20.0    학생
3  지수  35.0   없음

 apply()  함수를 사용한 결측치 처리

  •  apply()  함수를 사용해 사용자 정의함수로 결측치를 처리 가능
# 예시: '나이'가 결측치일 경우, 기본값으로 18을 채우는 함수
def fill_missing_age(x):
    if pd.isna(x):
        return 18
    return x

df['나이'] = df['나이'].apply(fill_missing_age)
print(df)

 

- 결과

   이름    나이    직업
0  철수  25.0    학생
1  영희  30.0  회사원
2  민수  20.0    학생
3  지수  35.0   없음