Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Pandas – 결측치(NaN)를 최빈값(Mode)으로 채우는 방법

최빈값(Mode)은 데이터 집합에서 가장 자주 나타나는 값을 의미합니다. 데이터 분석에서 결측치(NaN)를 처리할 때 평균이나 중앙값 대신 최빈값을 사용하면, 특히 범주형 데이터나 이상치의 영향을 받고 싶지 않은 경우에 유용합니다.

Pandas에서는 fillna() 메서드와 mode() 함수를 조합하여 누락된 열 값을 해당 열의 최빈값으로 손쉽게 채울 수 있습니다.

1. 필요한 라이브러리 임포트

먼저 pandas와 numpy를 각각 별칭(alias)과 함께 가져옵니다.

import pandas as pd
import numpy as np

2. 결측치가 포함된 DataFrame 생성

두 개의 열('Car', 'Units')을 가진 DataFrame을 만들어 보겠습니다. NumPy의 np.NaN을 사용하여 의도적으로 결측치를 포함시켰습니다.

dataFrame = pd.DataFrame(
    {
        "Car": ['BMW', 'Lexus', 'Lexus', 'Mustang', 'Bentley', 'Mustang'],
        "Units": [100, 150, np.NaN, 80, np.NaN, np.NaN]
    }
)

위 DataFrame의 'Units' 열에는 총 3개의 NaN 값이 존재합니다.

3. 최빈값으로 결측치 채우기

'Units' 열에 mode() 함수를 적용하여 최빈값을 구한 뒤, fillna() 메서드로 NaN 값을 대체합니다.

dataFrame.fillna(dataFrame['Units'].mode()[0], inplace=True)

여기서 주목할 점은 두 가지입니다.

  • mode()[0]: mode() 함수는 Series를 반환하기 때문에, 인덱스 [0]으로 첫 번째 최빈값을 추출해야 합니다.
  • inplace=True: 원본 DataFrame을 직접 수정하여 결과를 저장합니다.

전체 예제 코드

다음은 위 과정을 모두 포함한 완성된 코드입니다.

import pandas as pd
import numpy as np

# DataFrame 생성
dataFrame = pd.DataFrame(
    {
        "Car": ['BMW', 'Lexus', 'Lexus', 'Mustang', 'Bentley', 'Mustang'],
        "Units": [100, 150, np.NaN, 80, np.NaN, np.NaN]
    }
)

print("DataFrame ...\n", dataFrame)

# 'Units' 열의 최빈값을 구하여 NaN 값 대체
dataFrame.fillna(dataFrame['Units'].mode()[0], inplace=True)

print("\n최빈값으로 NaN을 채운 후의 DataFrame...\n", dataFrame)

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

DataFrame ...
       Car   Units
0     BMW   100.0
1   Lexus   150.0
2   Lexus     NaN
3 Mustang    80.0
4 Bentley     NaN
5 Mustang     NaN

Updated Dataframe after filling NaN values with mode...
       Car   Units
0     BMW   100.0
1   Lexus   150.0
2   Lexus    80.0
3 Mustang    80.0
4 Bentley    80.0
5 Mustang    80.0

정리

'Units' 열의 값 중 가장 많이 등장하는 값은 80입니다. 따라서 fillna() 메서드를 통해 기존의 NaN 값들이 모두 80으로 채워진 것을 확인할 수 있습니다.

참고로, 최빈값 외에도 mean()(평균), median()(중앙값)을 활용하여 같은 방식으로 결측치를 처리할 수 있으며, 데이터의 특성에 맞는 방법을 선택하는 것이 중요합니다.