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]})
df
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))
False True False False

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))
False False True True

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))
True False False False

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))
False True False False
print(np.isneginf(1), np.isneginf(np.inf), np.isneginf(-np.inf), np.isneginf(np.nan))
False False True False
comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin pinterest medium vimeo stackoverflow reddit quora quora