Pandas에서 결측치(NaN) 처리하기

Pandas에서 결측치(NaN) 처리하기

Pandas
Pandas에서 결측치(NaN) 처리하기
Author

gabriel yang

Published

September 21, 2024


데이터 분석을 할 때 결측치(NaN)는 흔히 발생하는 문제 중 하나입니다. 결측치는 잘못된 분석 결과를 초래할 수 있기 때문에, 이를 적절하게 처리하는 것이 중요합니다. Pandas는 다양한 결측치 처리 기능을 제공하여 데이터를 정제하고 분석의 정확성을 높일 수 있습니다. 이번 포스팅에서는 Pandas에서 결측치를 처리하는 여러 방법을 예시 코드와 함께 소개하겠습니다.

1. 결측치 확인하기

먼저, 결측치를 처리하기 전에 데이터셋에서 결측치가 있는지 확인해야 합니다. isnull() 메서드를 사용하여 데이터프레임 내의 결측치를 확인할 수 있습니다.

import pandas as pd

# 예제 데이터 생성
data = {
    '이름': ['Alice', 'Bob', 'Charlie', None],
    '나이': [24, None, 22, 25],
    '점수': [85, 90, None, 88]
}
df = pd.DataFrame(data)

# 결측치 확인
df.isnull()
이름 나이 점수
0 False False False
1 False True False
2 False False True
3 True False False

위 코드에서는 각 값이 결측치인지 여부를 True/False로 표시합니다. 결측치의 개수를 확인하고 싶다면 sum() 메서드를 사용합니다.

# 컬럼별 결측치 개수 확인
print(df.isnull().sum())
이름    1
나이    1
점수    1
dtype: int64

2. 결측치 제거하기

dropna() 메서드

결측치를 포함한 행 또는 열을 제거할 때 사용합니다.

  • axis=0 (기본값): 결측치가 있는 행을 제거합니다.
  • axis=1: 결측치가 있는 열을 제거합니다.
  • how='all': 모든 값이 결측치일 때만 제거합니다.
# 결측치가 있는 행 제거
df_dropna_rows = df.dropna()
print(df_dropna_rows)
      이름    나이    점수
0  Alice  24.0  85.0
# 결측치가 있는 열 제거
df_dropna_cols = df.dropna(axis=1)
print(df_dropna_cols)
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]

3. 결측치 채우기

fillna() 메서드

결측치를 특정 값으로 채우고자 할 때 사용합니다. 다양한 옵션을 사용하여 결측치를 채울 수 있습니다.

1. 단일 값으로 채우기

# 결측치를 0으로 채우기
df_fillna_0 = df.fillna(0)
print(df_fillna_0)
        이름    나이    점수
0    Alice  24.0  85.0
1      Bob   0.0  90.0
2  Charlie  22.0   0.0
3        0  25.0  88.0

2. 컬럼별 다른 값으로 채우기

각 컬럼마다 다른 값을 사용하여 결측치를 채울 수 있습니다.

# 컬럼별로 다른 값으로 채우기
df_fillna_custom = df.fillna({'이름': 'Unknown', '나이': df['나이'].mean(), '점수': 50})
print(df_fillna_custom)
        이름         나이    점수
0    Alice  24.000000  85.0
1      Bob  23.666667  90.0
2  Charlie  22.000000  50.0
3  Unknown  25.000000  88.0

3. 이전/다음 값으로 채우기 (method 옵션)

이전 값이나 다음 값으로 결측치를 채울 수 있습니다.

# 앞의 값으로 채우기 (forward fill)
df_fillna_ffill = df.fillna(method='ffill')
print(df_fillna_ffill)
        이름    나이    점수
0    Alice  24.0  85.0
1      Bob  24.0  90.0
2  Charlie  22.0  90.0
3  Charlie  25.0  88.0
# 뒤의 값으로 채우기 (backward fill)
df_fillna_bfill = df.fillna(method='bfill')
print(df_fillna_bfill)
        이름    나이    점수
0    Alice  24.0  85.0
1      Bob  22.0  90.0
2  Charlie  22.0  88.0
3     None  25.0  88.0

4. 결측치 대체하기

replace() 메서드

특정 값을 다른 값으로 대체할 때 사용합니다. 결측치뿐만 아니라 다른 값도 대체할 수 있습니다.

# 'Bob'을 'Robert'으로 변경
df_replace = df.replace('Bob', 'Robert')
print(df_replace)
        이름    나이    점수
0    Alice  24.0  85.0
1   Robert   NaN  90.0
2  Charlie  22.0   NaN
3     None  25.0  88.0

결측치를 특정 값으로 대체할 수도 있습니다.

# NaN을 0으로 대체
df_replace_nan = df.replace({None: 'Unknown'})
print(df_replace_nan)
        이름    나이    점수
0    Alice  24.0  85.0
1      Bob   NaN  90.0
2  Charlie  22.0   NaN
3  Unknown  25.0  88.0

5. 결측치 보간하기

interpolate() 메서드

숫자 데이터를 가진 컬럼에서 결측치를 선형 보간법 등으로 채울 수 있습니다.

# 선형 보간법을 사용하여 결측치 채우기
df_interpolate = df.interpolate()
print(df_interpolate)
        이름    나이    점수
0    Alice  24.0  85.0
1      Bob  23.0  90.0
2  Charlie  22.0  89.0
3     None  25.0  88.0

보간 방법은 ‘linear’ 이외에도 다양한 옵션이 있습니다. pandasinterpolate() 함수는 결측값(NaN)을 보간할 때 사용할 수 있는 다양한 보간 방법을 제공합니다. 주요 보간 방법은 다음과 같습니다.

method 파라미터 옵션

interpolate() 함수의 method 파라미터를 사용하여 다양한 보간 방법을 선택할 수 있습니다. 기본적인 보간 방법은 다음과 같습니다:

  1. 'linear' (기본값): 선형 보간입니다. 결측값 양쪽의 값을 직선으로 연결하여 중간 값을 계산합니다.
  2. 'time': 시간 데이터에 대해 선형 보간을 수행합니다. index 또는 columndatetime 타입이어야 합니다.
  3. 'index': index를 기준으로 선형 보간을 수행합니다.
  4. 'pad' / 'ffill' (Forward Fill): 앞의 값으로 결측값을 채웁니다.
  5. 'backfill' / 'bfill': 뒤의 값으로 결측값을 채웁니다.
  6. 'nearest': 가장 가까운 값으로 결측값을 채웁니다.
  7. 'polynomial': 다항식 보간입니다. order 파라미터로 다항식의 차수를 지정해야 합니다. 예를 들어, method='polynomial', order=2는 2차 다항식 보간입니다.

기타 파라미터

  • limit: 연속된 결측값의 보간 가능 최대 개수를 지정합니다.
  • limit_direction: 'forward', 'backward', 'both'로 보간의 방향을 지정합니다.
  • limit_area: 'inside', 'outside'로 보간이 이루어지는 영역을 제한합니다.
  • axis: 보간할 축을 지정합니다. 0은 행(row), 1은 열(column)을 의미합니다.

사용 예시

import pandas as pd
import numpy as np

# 예제 데이터 생성
data = {'A': [0, np.nan, 4, np.nan, 32, 64]}
df = pd.DataFrame(data)

# 선형 보간
df_interpolated_linear = df.interpolate(method='linear')
df_interpolated_linear.plot()
<Axes: >

2차 다항식 보간은 아래와 같습니다.

# 2차 다항식 보간
df_interpolated_poly = df.interpolate(method='polynomial', order=2)
df_interpolated_poly.plot()
<Axes: >

각 방법은 데이터의 특성에 따라 적합한 보간법을 선택해야 하며, 데이터의 패턴과 성격에 맞는 보간 방법을 사용하는 것이 중요합니다.