Pandas inf 찾기 - Pandas inf chajgi

Python Pandas 패키지의 DataFrame을 사용하다 보면

데이터프레임의 값이 np.inf 또는 -np.inf로 채워진 경우가 있습니다.

  • inf : Infinitie (무한)을 의미

np.inf, -np.inf어떤 사칙연산을 수행해도 np.inf or -np.inf 로만 변환되기에

코드에서 종종 오류 일으킵니다.

이때 DataFrame.replace 메서드로 간단하게 np.inf, -np.inf를 None값으로 대체할 수 있습니다.

import pandas as pd
import numpy as np
df = pd.DataFrame([1000, 2000, 3000, -4000, np.inf, -np.inf])
print("Original DataFrame:")
print(df)

print("Removing infinite values:")
df = df.replace([np.inf, -np.inf], np.nan) # replace 메서드로 np.inf를 None(np.nan)으로 변경
print(df)
======= Output ======
>>>
Original DataFrame:
        0
0  1000.0
1  2000.0
2  3000.0
3 -4000.0
4     inf
5    -inf
Removing infinite values:
        0
0  1000.0
1  2000.0
2  3000.0
3 -4000.0
4     NaN
5     NaN

혹시 궁금하신 사항은 댓글 남겨주세요.

감사합니다.

1. w3resource, [Pandas: Remove infinite values from a given DataFrame], https://www.w3resource.com/python-exercises/pandas/python-pandas-data-frame-exercise-52.php
2. pandas 공식문서, [pandas.DataFrame.replace], https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.replace.html

python에서 값들을 다루다보면 inf 또는 NaN 인 경우가 발생할 수도 있는데요.

오늘은 어떻게 변수의 inf 또는 NaN 여부 확인방법을 알아보겠습니다.

여기서 잠깐!

inf, NaN 이 무엇인지 모르신다고요? 그럼 다음 글을 먼저 봐주세요.

2018/06/29 - [개발/Python] - [Python/기초] What is inf and nan?

inf 여부 확인방법

변수에[ float('inf') ] 값이 담겨있다면?

간단한 방법으로는 math package의 isinf() 함수를 이용해주면 됩니다.

import math
x = float('inf')
math.isinf(x)

isinf() 함수에 정의된 설명을 살펴보면 다음과 같이 쓰여있습니다.

Check if the float x is infinite (positive or negative).
- float x 의 값이 inf 또는 -inf 인지 여부를 확인하는 함수이다.
New in version 2.6

NaN 여부 확인방법

어떤 변수에 다음과 같은 값 [ float('nan') ]이 담겨 있을 때, 예외처리를 해줄 필요가 종종 있을텐데요.

* 변수가 NaN 이라는것은 Not A Number를 의미하며, 숫자가 아니기 때문에 어떠한 수학적 연산을 할 수 없다는 것을 의미합니다.

간단한 방법으로는 math package의 isnan() 함수를 이용해주면 됩니다.

import math
x = float('nan')
math.isnan(x)

isnan() 함수에 정의된 설명을 살펴보면 다음과 같이 쓰여있습니다.

Check if the float x is a NaN (not a number).
- float x 의 값이 NaN 인지 여부를 확인하는 함수이다.
New in version 2.6

추가적으로 math package의 isnan()을 이용하지 않고도 자기자신과 비교해 같은지 여부를 확인하는 방법으로도 NaN 여부를 확인할 수 있습니다.

def isNaN(num):
    return num != num

흥미로운 내용

NaN 및 inf 가 어떤 history를 가지고 있는지에 대한 자세한 내용은 PEP754 에 명시돼 있네요.

https://www.python.org/dev/peps/pep-0754/

참 간단하죠?

그럼 지금까지 inf, NaN 여부를 어떻게 확인하는지를 설명하는 글이었습니다.


dropna, fillna, inf, NAN, np.inf, np.nan, pandas, Python, replace

  • 전체 컬럼에서 mean()을 계산하는데 계속 inf의 값이 나왔다.
  • 분명히 NaN의 값을 fillna(0.0)으로 했지만 계속 문제가 나옴.
  • head(100).tail(50).head(25) 이런식으로 원식적으로... 접근해보니 inf의 값이 있었다.
  • 아래 방법을 통해서 np.inf로 찾아내고, nan으로 변경하고 fillna(0.0)을 하자
import numpy as np

df.replace([np.inf, -np.inf], np.nan).dropna(subset=["col1", "col2"], how="all")

저작자표시 비영리 변경금지

'우리는 개발자 > Data Science' 카테고리의 다른 글

[Pandas] DataFrame에서 str.split을 이용해 하나의 컬럼을 두개의 컬럼으로 나누는 방법  (0)2019.09.04
[Pandas] DataFrame을 Elasticsearch Index로 삽입하는 방법, DataFrame2EsIndex  (0)2019.09.04
[Pandas] DataFrame을 Spark의 DataFrame으로 변환 PandasDataFrame To SparkDataFrame  (0)2019.09.04
[Pandas] Json 파일 DataFrame으로 변환하는 방법 Dictionary2DataFrame  (0)2019.09.04
[Pandas] DataFrame CSV 파일 읽을때 iterator를 이용해 필요한 데이터만 메모리에 올리는 방법  (0)2019.09.04

NAME

PASSWORD

HOMEPAGE

SECRET

    내용

    • 결측값과 무한값 생성
    • 결측값과 무한값 결정
    • 무한값 결정
    • Nan 결정

    결측치와 무한값찾기

    이터 처리 과정에서 누락된 값이나 계산과정에서 무한값을 얻게되는 경우가 있는데 이러한 값들은 이어진 계산과정에서 에러를 발생하는 경우가 많습니다. 그러므로 분석 전 또는 분석 동안 이들의 처리 과정이 중요하며 그 일환으로 먼저 그들의 인식과정을 먼저 살펴봅니다.

    결측값과 무한값 생성

    numpy의 속성값인 np.nan으로 결측치(nan(Not Any Number))를 인위적으로 생성할 수 있습니다.또한 무한값은 내장함수인 float()를 사용하여 생성할 수 있습니다.

    import math
    import numpy as np
    import pandas as pd
    x=np.random.rand(20)
    x
    array([0.44245459, 0.8178457 , 0.19687037, 0.54456459, 0.2971784 ,
           0.9188978 , 0.37880048, 0.10845443, 0.84552398, 0.73500799,
           0.8996776 , 0.38032666, 0.15925506, 0.70421241, 0.46348431,
           0.76245393, 0.25619259, 0.92892586, 0.11489276, 0.51422256])
    # 특정한 요소들을 nan 또는 infinity로 치환
    x[3]=np.nan #nan
    x[9]=np.nan
    x[7]=float('inf') #inifinity
    x[16]=float('-inf') #-infintiy
    np.around(x, 4)
    array([0.4425, 0.8178, 0.1969,    nan, 0.2972, 0.9189, 0.3788,    inf,
           0.8455,    nan, 0.8997, 0.3803, 0.1593, 0.7042, 0.4635, 0.7625,
             -inf, 0.9289, 0.1149, 0.5142])

    결측값과 무한값 결정

    위의 자료에서 naninf, -inf를 결정합니다.

    • math.isfinite(값): 객체의 각 요소 단위로 NaN 또는 Infinity가 아닐 경우 True를 반환한다.
    • np.isfinite(array객체): 객체 또는 요소에 위의 math.isfinite와 같은 결과를 반환
    math.isfinite(x[3])
    False
    np.isfinite(x[3])
    False
    x1=np.isfinite(x)
    x1
    array([ True,  True,  True, False,  True,  True,  True, False,  True,
           False,  True,  True,  True,  True,  True,  True, False,  True,
            True,  True])

    위의 객체에서 False 부분이 nan과 infinity이므로 이들의 인덱스를 알아보기 위해 np.where(condition)를 적용합니다. 이 함수는 배열객체 또는 DataFrame, Series 객체에 대해 지정한 조건에 맞는 부분의 인덱스를 반환 합니다.

    np.where(x1==False)
    (array([ 3,  7,  9, 16]),)

    무한값 결정

    • math.isinf(x): 원소단위 infinity일 경우 True
    • np.isinf(array 객체): 객체의 각 원소를 판단하여 infinity일 경우 True
    x2=[math.isinf(i) for i in x]
    print(x2, end="")
    [False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, True, False, False, False]

    위 객체 x2는 리스트이므로 .index(인수) 메서드를 사용하여 대상의 인덱스를 찾을 수 있다. 그러나 이 함수는 객체 중 대상과 일치하는 첫부분만을 반환한다.

    x2.index(True)
    7

    대상에 적합한 모든 값들을 찾기 위해서는 배열 객체로 전환한 후 np.where()를 적용합니다.

    p.isinf(x)
    array([False, False, False, False, False, False, False,  True, False,
           False, False, False, False, False, False, False,  True, False,
           False, False])
    np.where(np.isinf(x))
    (array([ 7, 16]),)

    numpy 모듈은 양의 무한값(positive infinity)와 음의 무한값(negative infinity)를 구별한다.

    • np.isposinf(array객체 또는 원소): 양의 무한값이면 True
    • np.isneginf(array객체 또는 원소): 음의 무한값이면 True
    np.where(np.isposinf(x)) # = np.inf
    (array([7]),)
    np.where(np.isneginf(x)) # = -np.inf
    (array([16]),)

    Nan 결정

    결측값 nan은 다음 함수로 결정할 수 있습니다.

    • math.isnan():요소 단위로 nan이면 True를 반환
    • np.isnan(): 객체의 전체와 요소별로 nan인 경우 True를 반환
    x3=[math.isnan(i) for i in x]
    print(x3, end="")
    [False, False, False, True, …, False, False, False, False]
    x3.index(True)
    3
    np.isnan(x)
    array([False, False, False,  True, False, False, False, False, False,
            True, False, False, False, False, False, False, False, False,
           False, False])
    np.where(np.isnan(x))
    (array([3, 9]),)