문제 개요
데이터 분석을 하다 보면 결측치(NaN)가 포함된 시리즈를 자주 접하게 됩니다. 이 글에서는 pandas와 numpy를 활용하여 시리즈 안에서 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() 기반 접근이 널리 사용됩니다.