Pandas 기초

파이썬에서 표 형태의 데이터를 탐색하고 분석하는데 사용하는 판다스 라이브러리 사용법을 알아봅니다.


수강중

16. 결측값

동영상이 없는 텍스트 강의 자료입니다.

결측값

결측값(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