이번 포스팅에서는 데이터 분석 시 필수적으로 알아야 하는 Python Pandas 라이브러리의 함수 중 결측치를 대체하는 함수 fillna 에 대해서 알아 보겠습니다.
결측치를 대체하는 함수 fillna 구문
지정된 방법을 사용하여 결측치(NA/NaN 값)를 다른 값으로 대체합니다. 기본 구문은 아래와 같습니다.
DataFrame.fillna(value = None, *,
method = None,
axis = None,
inplace = False,
limit = None,
downcast = _NoDefault.no_default)
반환값은 Series , DataFrame, None 입니다.
결측치를 대체하는 함수 fillna 인수
- value : scalar, dict, Series, or DataFrame
- 결측치를 채우는 데 사용할 값(예: 0), 또는 각 인덱스(Series의 경우) 또는 열(DataFrame의 경우)에 사용할 값을 지정하는 값의 dict/Series/DataFrame입니다. dict/Series/DataFrame에 없는 값은 대체되지 않습니다. 이 값은 리스트일 수 없습니다.
- method : {‘backfill’, ‘bfill’, ‘ffill’, None}, default None
- 재인덱싱된 Series의 결측치를 대체하는 데 사용하는 방법을 정의합니다.
- ffill: 마지막 유효한 값을 다음 유효한 값으로 대체합니다.
- backfill / bfill: 다음 유효한 값을 사용하여 결측치를 대체합니다.
- axis : {0 or ‘index’} for Series, {0 or ‘index’, 1 or ‘columns’} for DataFrame
- 결측치를 대체할 축을 정의 합니다. Series의 경우 이 인수는 사용되지 않으며 기본값은 0입니다.
- inplace : bool, default False
- True인 경우 결측치가 대체된 결과를 기존 DataFrame에 업데이트합니다. 참고: 이렇게 하면 이 개체의 다른 보기가 수정됩니다(예: DataFrame의 열에 대한 복사 없음 조각).
- limit : int, default None
- method를 명시할 경우, limit 인수는 앞으로/뒤로 채우기 위한 연속 결측치의 최대 개수를 정의합니다. 즉, 이 연속 결측치 수보다 많은 간격이 있는 경우 부분적으로만 채워집니다. method가 지정되지 않은 경우 이는 결측치가 채워지는 전체 축의 최대 항목 수입니다. None이 아닌 경우 0보다 커야 합니다.
- downcast : dict, default is None
- 가능한 경우 다운캐스트할 항목에 대한 item->dtype 딕셔너리 또는 동일한 유형(예: 가능한 경우 float64에서 int64로)으로 다운캐스트를 시도하는 문자열 ‘추론’입니다.
결측치를 대체하는 함수 fillna 사용 예시
# 예시를 위한 임시 데이터프레임 생성
import pandas as pd
import numpy as np
tempData = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, np.nan],
[np.nan, 3, np.nan, 4]], columns = list("ABCD"))
tempData
--------------------------------------------------------------------------------
A B C D
0 NaN 2.0 NaN 0.0
1 3.0 4.0 NaN 1.0
2 NaN NaN NaN NaN
3 NaN 3.0 NaN 4.0
모든 결측치 요소를 0으로 대체하려면 ?
tempData.fillna(0)
--------------------------------
A B C D
0 0.0 2.0 0.0 0.0
1 3.0 4.0 0.0 1.0
2 0.0 0.0 0.0 0.0
3 0.0 3.0 0.0 4.0
‘A’, ‘B’, ‘C’, ‘D’ 열의 모든 결측치 요소를 각각 0, 1, 2, 3으로 대체하려면 ?
values = {"A": 0, "B": 1, "C": 2, "D": 3}
tempData.fillna(value = values)
------------------------------------------------
A B C D
0 0.0 2.0 2.0 0.0
1 3.0 4.0 2.0 1.0
2 0.0 1.0 2.0 3.0
3 0.0 3.0 2.0 4.0
첫 번째 결측치 요소만 대체하려면 ?
tempData.fillna(value = values, limit = 1)
------------------------------------------------
A B C D
0 0.0 2.0 2.0 0.0
1 3.0 4.0 NaN 1.0
2 NaN 1.0 NaN 3.0
3 NaN 3.0 NaN 4.0
DataFrame을 사용하면 동일한 열 이름과 동일한 인덱스를 따라 결측치를 대체함
tempData2 = pd.DataFrame(np.zeros((4, 4)), columns = list("ABCE"))
tempData.fillna(tempData2)
------------------------------------------------------------------------
A B C D
0 0.0 2.0 0.0 0.0
1 3.0 4.0 0.0 1.0
2 0.0 0.0 0.0 NaN
3 0.0 3.0 0.0 4.0
DataFrame의 각 열의 평균값으로 대체하려면 ?
DataFrame의 각 열을 그룹으로 평균을 계산하면, 열을 인덱스로 하고, 평균을 값으로 하는 Series를 생성합니다. Series를 이용하면 각 열의 평균값으로 대체할 수 있습니다.
# 각 열을 그룹으로 평균 계산
meanForColumn = tempData.mean()
meanForColumn
----------------------------------
A 3.000000
B 3.000000
C NaN
D 1.666667
dtype: float64
# Raw DataFrame
# tempData
# -------------------------
# A B C D
#0 NaN 2.0 NaN 0.0
#1 3.0 4.0 NaN 1.0
#2 NaN NaN NaN NaN
#3 NaN 3.0 NaN 4.0
# 각 열을 그룹으로 계산한 평균값으로 결측치 대체
tempData.fillna(value = meanForColumn)
--------------------------------------------
A B C D
0 3.0 2.0 NaN 0.000000
1 3.0 4.0 NaN 1.000000
2 3.0 3.0 NaN 1.666667
3 3.0 3.0 NaN 4.000000
이상으로 데이터 분석 시 필수적으로 알아야 하는 Python Pandas 라이브러리의 함수 중 결측치를 대체하는 함수 fillna 에 대해서 알아 보았습니다. 데이터 전처리 과정에서 매우 중요한 함수로 꼭 학습하시기 바랍니다.
감사합니다!