Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 시리즈(Series)에서 NaN 값의 인덱스를 찾는 프로그램 작성하기

문제 개요

데이터 분석을 하다 보면 결측치(NaN)가 포함된 시리즈를 자주 접하게 됩니다. 이 글에서는 pandasnumpy를 활용하여 시리즈 안에서 NaN 값이 존재하는 위치, 즉 인덱스를 찾아 출력하는 방법을 단계별로 알아보겠습니다.

입력

다음과 같은 시리즈가 있다고 가정해 보겠습니다.

0    1.0
1    2.0
2    3.0
3    NaN
4    4.0
5    NaN

출력

NaN 값이 있는 인덱스를 찾으면 다음과 같은 결과가 나옵니다.

index is 3
index is 5

해결 방법

이 문제는 아래 두 단계만 거치면 손쉽게 해결할 수 있습니다.

  • NaN 값을 포함하는 시리즈를 정의합니다.

  • for 반복문으로 시리즈의 모든 요소에 접근한 뒤, np.isnan() 함수를 사용해 해당 값이 NaN인지 검사합니다. 조건이 참이면 그 위치의 인덱스를 출력합니다.

for i, j in data.items():
    if(np.isnan(j)):
        print("index is", i)

여기서 data.items()는 시리즈의 (인덱스, 값) 쌍을 하나씩 반환하므로, 변수 i에는 인덱스가, j에는 값이 순서대로 할당됩니다.

예제 코드

아래 전체 구현 예제를 통해 더 자세히 이해해 보겠습니다.

import pandas as pd
import numpy as np

l = [1, 2, 3, np.nan, 4, np.nan]
data = pd.Series(l)
print(data)

for i, j in data.items():
    if(np.isnan(j)):
        print("index is", i)

실행 결과

0    1.0
1    2.0
2    3.0
3    NaN
4    4.0
5    NaN
dtype: float64
index is 3
index is 5

대안 방법: 벡터화 연산 활용하기

반복문 없이도 pandas의 불리언 인덱싱을 이용하면 한 줄로 NaN 인덱스를 구할 수 있습니다. 데이터 크기가 클 때는 이 방식이 훨씬 빠르고 효율적입니다.

# isna()와 불리언 인덱싱 활용
nan_index = data[data.isna()].index
print(nan_index)   # Index([3, 5], dtype='int64')

# numpy의 where 함수 활용
import numpy as np
print(np.where(data.isna())[0])   # [3 5]

두 방법 모두 동일하게 인덱스 3과 5를 반환하며, 실무에서는 가독성과 성능 면에서 isna() 기반 접근이 널리 사용됩니다.