본문으로 건너뛰기
김신건의 로그

[Pandas] isin / isna / notna

· 수정 · 📖 약 1분 · 184자/단어 #python #pandas #filter #null
Pandas isin, Pandas isna, Pandas notna, Pandas isin / isna, Pandas null check

정의

메서드의미
.isin(values)각 원소가 values 안에 있는지 (boolean Series)
.isna()NaN/NaT/None 여부 (isnull 별칭)
.notna()위의 반대 (notnull 별칭)

isin

여러 값 중 하나에 해당하는지 검사. SQL 의 IN (...) 과 같음.

python
import pandas as pd
df = pd.DataFrame({
  'name': ['Alice', 'Bob', 'Charlie', 'Dave'],
  'city': ['Seoul', 'Busan', 'Daegu', 'Seoul'],
})
mask = df['city'].isin(['Seoul', 'Busan'])
print(df[mask])
결과
    name   city
0  Alice  Seoul
1    Bob  Busan
3   Dave  Seoul
namecity
0AliceSeoul
1BobBusan
3DaveSeoul

부정 (NOT IN)

df[~df['city'].isin(['Seoul'])]    # Seoul 아닌 것

dict / DataFrame 전달

df.isin({'city': ['Seoul'], 'name': ['Alice']})
# 컬럼별로 다른 set

isna / notna

df = pd.DataFrame({'a': [1, None, 3], 'b': [None, 2, 3]})

df.isna()                # 같은 shape 의 boolean DataFrame
df['a'].isna()           # Series
df['a'].notna()          # 반대

df[df['a'].notna()]      # a 가 not null 인 행만
df.dropna()              # 어느 컬럼이든 NaN 있는 행 제거
df.dropna(subset=['a'])   # a 컬럼만 검사
python
import pandas as pd
import numpy as np
df = pd.DataFrame({
  'a': [1, np.nan, 3, np.nan],
  'b': [10, 20, np.nan, 40],
})
print(df.isna())
print('---null count---')
print(df.isna().sum())
결과
       a      b
0  False  False
1   True  False
2  False   True
3   True  False
---null count---
a    2
b    1
dtype: int64

any / all 과 결합

# 어느 컬럼이든 NaN 인 행
df[df.isna().any(axis=1)]

# 모든 컬럼이 NaN 인 행
df[df.isna().all(axis=1)]

# 컬럼별로 NaN 비율
df.isna().mean()

NaN, None, NaT 의 차이

타입대응
np.nanfloat수치형 결측
NoneNoneTypeobject 결측, 자동 NaN 변환
pd.NaTNaTTypedatetime 결측
pd.NANATypenullable dtype 의 결측 (pandas 1.x+)

.isna() 는 위 모두를 True 로 본다.

함정

1. == np.nan 안 됨

df[df['a'] == np.nan]    # ❌ 항상 False
df[df['a'].isna()]        # ✓

NaN != NaN 이라는 IEEE 754 규약 때문.

2. is None 도 권장 안 함

df['a'] is None    # ❌ Series 가 None 인지 검사
df['a'].isna()     # ✓ 각 원소 검사

3. isin 의 dtype 불일치

df = pd.DataFrame({'id': [1, 2, 3]})  # int
df['id'].isin(['1', '2'])              # 모두 False (str vs int)
df['id'].isin([1, 2])                  # ✓

참고

이 글의 용어 (3개)
[Pandas] Boolean Indexingpandas
정의 Boolean Indexing 은 True/False 의 Series 를 인덱서로 전달 해 행을 선택하는 패턴. pandas 의 가장 흔한 필터링 방법. 기본 <CodeWi…
[Pandas] dropna / fillnapandas
정의 - : NaN 이 있는 행/열 제거 - : NaN 을 특정 값으로 대체 데이터 분석의 가장 기본적인 결측치 처리. dropna 기본 <CodeWithOutput langua…
[Pandas] query / evalpandas
정의 - : 문자열로 boolean 표현식 을 전달해 행 필터링 - : 문자열로 계산 표현식 을 평가 의 가독성 있는 대안. query 기본 긴 조건일수록 query 가 짧고 읽…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기