결측값 :: Pandas 기초 - mindscale
Skip to content

결측값

결측값

결측값(missing value)란 데이터에서 값이 비어있는 경우를 말합니다.

판다스에서는 numpynan을 사용해서 결측값을 표시합니다.

import numpy as np
import pandas as pd

df = pd.DataFrame({'x': [1, 2, np.nan, 3]})

df
x
0 1.0
1 2.0
2 NaN
3 3.0

결측값인가?

결측값 여부를 확인하려면 .isna() 메소드를 이용합니다. 결측값이면 True라고 표시됩니다.

df['x'].isna()
0    False
1    False
2     True
3    False
Name: x, dtype: bool

별도의 함수가 필요한 이유는 nan끼리 같다고 비교하면 거짓(False)이 되기 때문입니다.

np.nan == np.nan
False

.isnull() 메소드를 사용해도 됩니다. (이름만 다르고 똑같은 메소드)

df['x'].isnull()
0    False
1    False
2     True
3    False
Name: x, dtype: bool

결측값이 아님을 확인하려면 .notna()를 사용합니다.

df['x'].notna()
0     True
1     True
2    False
3     True
Name: x, dtype: bool

결측값이 아닌 행만 보기

[]에 참/거짓을 나타내는 값을 넣으면 그 값이 참인 행만 보이게 됩니다. 따라서 아래처럼 하면 결측값을 제외하고 나머지 행들만 볼 수 있습니다.

df[df['x'].notna()]
x
0 1.0
1 2.0
3 3.0

query 메소드를 사용할 때는 다음과 같이 합니다. engine='python'을 반드시 넣어줘야 합니다.

df.query('x.notna()', engine='python')
x
0 1.0
1 2.0
3 3.0

.dropna를 사용하면 결측값이 있는 행을 모두 없앨 수 있습니다.

df.dropna()
x
0 1.0
1 2.0
3 3.0

결측값이 있을 때 계산

판다스에서 통계 함수들은 기본적으로 결측값을 제외하고 계산합니다.

df['x'].sum()
6.0
df['x'].mean()
2.0

skipna=False라는 옵션을 사용하면 결측값을 건너뛰지 않습니다. 이 경우 결측값이 하나라도 포함되어 있으면 계산 결과도 nan이 됩니다.

df['x'].sum(skipna=False)
nan

결측값 채우기

.fillna 메소드를 사용하면 결측값을 지정한 값으로 채울 수 있습니다.

df['x'].fillna(0)
0    1.0
1    2.0
2    0.0
3    3.0
Name: x, dtype: float64

아래처럼 하면 결측값을 99로 채웁니다.

df['x'].fillna(99)
0     1.0
1     2.0
2    99.0
3     3.0
Name: x, dtype: float64

모두 동일한 값으로 채우는 대신 직전의 값으로 채울 수도 있습니다. 아래의 경우 결측값을 그 이전의 값인 2.0으로 채웁니다.

df['x'].ffill()
0    1.0
1    2.0
2    2.0
3    3.0
Name: x, dtype: float64

반대로 직후의 값으로 채울 수 있습니다.

df['x'].bfill()
0    1.0
1    2.0
2    3.0
3    3.0
Name: x, dtype: float64

전후의 값으로 보간(interpolate)할 수도 있습니다. 아래에서는 결측값의 앞은 2.0, 뒤는 3.0이므로 평균해서 2.5로 채웁니다.

df['x'].interpolate()
0    1.0
1    2.0
2    2.5
3    3.0
Name: x, dtype: float64