결측값
결측값
결측값(missing value)란 데이터에서 값이 비어있는 경우를 말합니다.
판다스에서는 numpy
의 nan
을 사용해서 결측값을 표시합니다.
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