[Python Pandas] 결측치를 대체하는 함수 fillna 이해하기

이번 포스팅에서는 데이터 분석 시 필수적으로 알아야 하는 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 에 대해서 알아 보았습니다. 데이터 전처리 과정에서 매우 중요한 함수로 꼭 학습하시기 바랍니다.

감사합니다!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다