np.nan, np.inf, -np.inf 대체/삭제 등 처리
요약 :
데이터에 nan 또는 inf 값이 있을 때 이를 제거(또는 대체)하고 분석하고 싶다면?
import numpy as np
import pandas as pd
예시 데이터프레임
df = pd.DataFrame({'x':[1,2,-3,4,5], 'y':[np.nan,0,0,4,5], 'z':[np.nan,np.inf,-np.inf,1,2]})
| x | y | z |
0 | 1 | NaN | NaN |
1 | 2 | 0.0 | inf |
2 | -3 | 0.0 | -inf |
3 | 4 | 4.0 | 1.0 |
4 | 5 | 5.0 | 2.0 |
결측치대체하기
df.fillna(999) # nan만 대체됨
| x | y | z |
0 | 1 | 999.0 | 999.0 |
1 | 2 | 0.0 | inf |
2 | -3 | 0.0 | -inf |
3 | 4 | 4.0 | 1.0 |
4 | 5 | 5.0 | 2.0 |
df.replace([np.inf, -np.inf], 999)
| x | y | z |
0 | 1 | NaN | NaN |
1 | 2 | 0.0 | 999.0 |
2 | -3 | 0.0 | 999.0 |
3 | 4 | 4.0 | 1.0 |
4 | 5 | 5.0 | 2.0 |
df.replace([np.nan, np.inf, -np.inf], 999)
| x | y | z |
0 | 1 | 999.0 | 999.0 |
1 | 2 | 0.0 | 999.0 |
2 | -3 | 0.0 | 999.0 |
3 | 4 | 4.0 | 1.0 |
4 | 5 | 5.0 | 2.0 |
df1 = df.copy().replace([np.inf, -np.inf], np.nan) # inf, -inf를 nan으로 대체
df1.fillna(999, inplace=True)
df1
| x | y | z |
0 | 1 | 999.0 | 999.0 |
1 | 2 | 0.0 | 999.0 |
2 | -3 | 0.0 | 999.0 |
3 | 4 | 4.0 | 1.0 |
4 | 5 | 5.0 | 2.0 |
결측치가 있는 행 제거하기
df.dropna() # nan가 있는 행만 제거됨
| x | y | z |
1 | 2 | 0.0 | inf |
2 | -3 | 0.0 | -inf |
3 | 4 | 4.0 | 1.0 |
4 | 5 | 5.0 | 2.0 |
df[np.isfinite(df).all(1)] # nan, inf, -inf 제거
| x | y | z |
3 | 4 | 4.0 | 1.0 |
4 | 5 | 5.0 | 2.0 |
df[~df.isin([np.nan, np.inf, -np.inf]).any(1)] # nan, inf, -inf 제거
| x | y | z |
3 | 4 | 4.0 | 1.0 |
4 | 5 | 5.0 | 2.0 |
df1 = df.copy().replace([np.inf, -np.inf], np.nan) # inf, -inf를 nan으로 대체
df1.dropna(inplace=True) # nan 제거
df1
| x | y | z |
3 | 4 | 4.0 | 1.0 |
4 | 5 | 5.0 | 2.0 |
참고
numpy.isnan: NaN일 경우 True
https://numpy.org/doc/stable/reference/generated/numpy.isnan.html
print(np.isnan(1), np.isnan(np.nan), np.isnan(np.inf), np.isnan(-np.inf))
numpy.isinf: inf 또는 -inf일 경우 True
https://numpy.org/doc/stable/reference/generated/numpy.isnan.html
print(np.isinf(1), np.isinf(np.nan), np.isinf(np.inf), np.isinf(-np.inf))
numpy.isfinite : NaN 또는 Infinity가 아닐 경우 True
https://numpy.org/doc/stable/reference/generated/numpy.isinf.html
print(np.isfinite(1), np.isfinite(np.nan), np.isfinite(np.inf), np.isfinite(-np.inf))
numpy.isposinf / numpy.isneginf : 양/음의 무한값(positive/negative infinity)이면 True
https://numpy.org/doc/stable/reference/generated/numpy.isposinf.html
print(np.isposinf(1), np.isposinf(np.inf), np.isposinf(-np.inf), np.isposinf(np.nan))
print(np.isneginf(1), np.isneginf(np.inf), np.isneginf(-np.inf), np.isneginf(np.nan))