[Pandas] 4. 결측치 처리

2024. 3. 27. 21:31·IT

결측치는 데이터 분석에서 중요한 정보를 제공하지 않기 때문에

  1. 제거하거나
  2. 다른 값으로 대체

해야 합니다.

 

결측치를 처리하는 방법으로는

  • 결측치가 많은 열은 열을 제거합니다.
  • 결측치가 아주 많지 않은 열의 경우, 결측치를 가진 행만 제거합니다.
  • 결측치를 가진 데이터를 삭제하면 안되는 경우(결측치가 몇 개 안되거나, 전체 데이터가 적은 경우), 결측치를 다른 값으로 치환합니다.

 

1. 결측치 확인하기  : isnull()

`df.isnull().sum()`을 통해 각 열 별 결측치 개수를 확인할 수 있습니다.

  • `df.isnull()` : 결측치가 있는 위치에서 True를 반환합니다.
df.isnull().sum()

>>>
MovieId       5430
ImdbId        5430
TmdbId        5443
Title         5430
Year          5430
Genres        5430
UserId          18
Rating        5448
Timestamp     5448
Gender          18
Age             18
Occupation      18
dtype: int64

 

`df.info()`를 활용해도 탐색적으로 결측치 유무를 확인 가능합니다.

  • 아래의 예시에서 총 106284개의 데이터가 있는데, non-null의 값이 106284가 아니면 차이만큼이 결측치
df.info()

>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 106284 entries, 0 to 106283
Data columns (total 12 columns):
 #   Column      Non-Null Count   Dtype  
---  ------      --------------   -----  
 0   MovieId     100854 non-null  float64
 1   ImdbId      100854 non-null  float64
 2   TmdbId      100841 non-null  float64
 3   Title       100854 non-null  object 
 4   Year        100854 non-null  float64
 5   Genres      100854 non-null  object 
 6   UserId      106266 non-null  float64
 7   Rating      100836 non-null  float64
 8   Timestamp   100836 non-null  object 
 9   Gender      106266 non-null  object 
 10  Age         106266 non-null  float64
 11  Occupation  106266 non-null  object 
dtypes: float64(7), object(5)
memory usage: 9.7+ MB

 

2. 결측치 제거하기 : dropna()

대부분의 경우에서는 결측치를 삭제하는 방법이 가장 좋습니다.

  • 옵션
    • axis : 0(default)인 경우 행 제거, 1인 경우 열을 제거
    • subset : 특정 열을 지정하여 해당 열의 결측치를 제거, 리스트 형태로 복수의 컬럼 조건 지정 가능
    • tresh : 임계치를 주어 행에 해당 개수만큼 결측치가 있는 경우 제거
    • inplace : 결측치를 제거한 상태를 바로 저장

2-1) 목록 삭제 방식 (Listwise)

결측치가 있는 행 또는 열을 전부 삭제하는 방식

# 결측치가 있는 행을 전부 삭제
df_temp = df.dropna()

# 결측치가 있는 열을 전부 삭제
df_temp = df.dropna(axis=1)

 

2-2) 특정 값 조건 만족 시 삭제 방식 (Pairwise)

특정 값 조건 만족 시에만 결측치를 삭제하고, 다른 변수가 존재하는 경우에는 그대로 유지합니다.

# 행 전체가 결측치인 행만 삭제
df.dropna(how='all')

# 행의 결측치가 n개 초과인 행만 삭제
df.dropna(tresh=6)

# 특정 열들 중에 결측치가 있는 경우에만 행을 삭제
df.dropna(subset=['MovieId'])

3. 결측치 채우기 : fillna(), replace()

결측치를 특정 값으로 대체합니다. 가장 많이 사용되는 값은 `최빈값(mode), 중앙값(median), 평균(mean)`으로 채우는 평균화 기법과,

fillna()의 method 옵션을 활용하여 `이전 값(ffill), 이후 값(bfill)`과 같은 주변 값을 채우는 기법이 있습니다.

일반적으로 이전 값, 이후 값은 시계열 데이터에서 사용됩니다.

# 결측치를 특정 단일 값으로 대체하는 방법
df.fillna(0)

# 특정 열의 결측치를 다른 값으로 대체
df['UserId'].fillna(0, inplace=True)

# 평균화 기법을 사용하여 결측치 채우기
df['Age'].fillna(df['Age'].mean(), inplace=True)

# 최빈값으로 대체
df['Gender'].fillna(df['Gender'].mode()[0], inplace=True)

# 결측치를 주변 값으로 채우기
df.fillna(method='ffill')
df.fillna(method='bfill')
저작자표시 비영리 변경금지 (새창열림)

'IT' 카테고리의 다른 글

[가상면접 사례로 배우는 대규모 시스템 설계 기초] 2장. 개략적인 규모 추정  (0) 2024.05.18
[가상면접 사례로 배우는 대규모 시스템 설계 기초] 1장. 사용자 수에 따른 규모 확장성  (0) 2024.05.16
[Pandas] 3. DataFrame 조회(필터링), 변경  (0) 2024.03.27
[Pandas] 2. DataFrame 결합과 정렬  (0) 2024.03.27
[Pandas] 1. 데이터 탐색  (0) 2024.03.27
'IT' 카테고리의 다른 글
  • [가상면접 사례로 배우는 대규모 시스템 설계 기초] 2장. 개략적인 규모 추정
  • [가상면접 사례로 배우는 대규모 시스템 설계 기초] 1장. 사용자 수에 따른 규모 확장성
  • [Pandas] 3. DataFrame 조회(필터링), 변경
  • [Pandas] 2. DataFrame 결합과 정렬
기록미
기록미
많은 것들을 기록하고자 합니다.
  • 기록미
    기록의 아름다움
    기록미
  • 전체
    오늘
    어제
    • 전체 (35)
      • IT (22)
      • 블로그 (8)
      • 취미 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리 페이지
  • 링크

    • github 블로그
  • 공지사항

  • 인기 글

  • 태그

    Jupyter Notebook
    아이패드 드로잉
    가상환경
    homebrew
    Python
    Mac
    karabiner
    docker
    anaconda
    우분투
    Git
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
기록미
[Pandas] 4. 결측치 처리
상단으로

티스토리툴바