중앙값(median)은 데이터를 정렬했을 때 정확히 가운데 위치하는 값으로, 데이터의 상위 절반과 하위 절반을 구분하는 기준이 됩니다. Pandas에서는 fillna() 메서드에 중앙값을 지정하기만 하면 누락된(NaN) 열 값을 간단하게 중앙값으로 채울 수 있습니다.
먼저 필요한 라이브러리를 별칭(alias)과 함께 가져옵니다.
import pandas as pd
import numpy as np
두 개의 열('Car', 'Units')을 가진 DataFrame을 생성합니다. 이때 NumPy의 np.NaN을 사용해 의도적으로 결측치를 포함시켰습니다.
dataFrame = pd.DataFrame(
{
"Car": ['Lexus', 'BMW', 'Audi', 'Bentley', 'Mustang', 'Tesla'],
"Units": [100, 150, np.NaN, 80, np.NaN, np.NaN]
}
)
결측치가 있는 'Units' 열의 중앙값을 구한 뒤, 그 열에 위치한 NaN 값들을 해당 열의 중앙값으로 대체합니다. median() 함수를 활용하면 됩니다.
dataFrame.fillna(dataFrame['Units'].median(), inplace=True)
전체 예제 코드
다음은 지금까지의 내용을 정리한 전체 코드입니다.
import pandas as pd
import numpy as np
# DataFrame 생성
dataFrame = pd.DataFrame(
{
"Car": ['Lexus', 'BMW', 'Audi', 'Bentley', 'Mustang', 'Tesla'],
"Units": [100, 150, np.NaN, 80, np.NaN, np.NaN]
}
)
print("DataFrame ...\n", dataFrame)
# NaN이 있는 'Units' 열의 중앙값을 계산하여 결측치 대체
dataFrame.fillna(dataFrame['Units'].median(), inplace=True)
print("\n중앙값으로 NaN을 채운 후 업데이트된 DataFrame...\n", dataFrame)
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
DataFrame ...
Car Units
0 Lexus 100.0
1 BMW 150.0
2 Audi NaN
3 Bentley 80.0
4 Mustang NaN
5 Tesla NaN
중앙값으로 NaN을 채운 후 업데이트된 DataFrame...
Car Units
0 Lexus 100.0
1 BMW 150.0
2 Audi 100.0
3 Bentley 80.0
4 Mustang 100.0
5 Tesla 100.0
동작 원리 살펴보기
'Units' 열에서 실제 유효한 값은 100, 150, 80 세 개입니다(결측치 제외). 이 값들을 오름차순으로 정렬하면 80, 100, 150이 되며, 정확히 가운데 있는 100이 중앙값이 됩니다. 따라서 세 개의 NaN이 모두 100.0으로 채워진 것을 확인할 수 있습니다.
참고로 최신 버전의 Pandas에서는 inplace=True 대신 아래처럼 결과를 변수에 다시 할당하는 방식이 권장됩니다.
dataFrame = dataFrame.fillna(dataFrame['Units'].median())