달나라 노트

Python Pandas : where & mask (값 필터링하여 바꾸기) 본문

Python/Python Pandas

Python Pandas : where & mask (값 필터링하여 바꾸기)

CosmosProject 2026. 5. 12. 21:58
728x90
반응형

Pandas where() — 조건을 만족하지 않는 값을 바꾸는 메서드

비유로 먼저 이해하기

교통 신호등을 생각해보세요.
초록불(조건 True)이면 그대로 통과, 빨간불(조건 False)이면 멈추고 다른 값으로 대체됩니다.

where()은 이렇게 작동합니다.
"조건을 만족하는 값은 그대로, 아닌 값은 지정한 값으로 바꿔라"

clip()이 범위를 잘라내는 도구라면, where()은 조건식으로 원하는 값만 골라내는 도구입니다.

기본 문법

Series.where(cond, other=nan)
DataFrame.where(cond, other=nan)
파라미터 설명
cond True인 위치는 원래 값 유지, False인 위치는 대체
other False인 위치에 채울 값 (기본값: NaN)

예시 1 — 기본 사용

import pandas as pd

s = pd.Series([10, -3, 7, -1, 5])

s.where(s > 0)
# 0    10.0
# 1     NaN   ← 조건 False → NaN으로 대체
# 2     7.0
# 3     NaN   ← 조건 False → NaN으로 대체
# 4     5.0

other를 지정하면 NaN 대신 원하는 값으로 채울 수 있습니다.

s.where(s > 0, other=0)
# 0    10
# 1     0   ← -3 → 0
# 2     7
# 3     0   ← -1 → 0
# 4     5

예시 2 — 문자열 조건

import pandas as pd

grade = pd.Series(['A', 'B', 'F', 'A', 'F', 'C'])

grade.where(grade != 'F', other='재시험')
# 0        A
# 1        B
# 2     재시험   ← F → 재시험
# 3        A
# 4     재시험   ← F → 재시험
# 5        C

예시 3 — DataFrame에 적용

import pandas as pd

df = pd.DataFrame({
    '점수': [85, 42, 91, 38, 76],
    '출석': [95, 60, 88, 55, 72],
})

# 점수와 출석 모두 70 이상인 경우만 유지
df.where(df >= 70)
#      점수    출석
# 0    85.0   95.0
# 1     NaN    NaN   ← 42, 60 모두 탈락
# 2    91.0   88.0
# 3     NaN    NaN   ← 38, 55 모두 탈락
# 4    76.0   72.0

예시 4 — 다른 Series로 대체

other에 값 대신 다른 Series를 넘길 수 있습니다.
조건을 만족하지 않는 위치를 다른 컬럼의 값으로 채우는 식으로 활용합니다.

import pandas as pd

actual   = pd.Series([100, -5, 80, -20, 60])
fallback = pd.Series([0,    0,  0,   0,  0])

actual.where(actual >= 0, other=fallback)
# 0    100
# 1      0   ← -5  → fallback[1]
# 2     80
# 3      0   ← -20 → fallback[3]
# 4     60

where() vs mask()

mask()where()의 정반대입니다.

s = pd.Series([10, -3, 7, -1, 5])

s.where(s > 0, 0)  # 조건 True → 유지,  False → 0
# [10,  0,  7,  0,  5]

s.mask(s > 0, 0)   # 조건 True → 0,     False → 유지
# [ 0, -3,  0, -1,  0]
한 줄 요약: where는 "조건 맞으면 살리고", mask는 "조건 맞으면 죽인다".

where() vs clip()

  clip() where()
기준 범위(상한/하한) 조건식
유연성 숫자 범위에 특화 어떤 조건이든 가능
대표 용도 이상치 범위 제한 조건부 값 대체
# 아래 두 코드는 같은 결과
s.clip(lower=0)
s.where(s >= 0, other=0)

정리

상황 코드
음수를 NaN으로 s.where(s >= 0)
음수를 0으로 s.where(s >= 0, 0)
특정 문자열 대체 s.where(s != 'F', '재시험')
조건 불만족 시 다른 컬럼 값으로 df['A'].where(cond, df['B'])
반대 방향 (조건 만족 시 대체) s.mask(cond, other)

where()는 단순한 범위 제한을 넘어, 어떤 조건이든 자유롭게 걸어서 값을 선택적으로 바꿀 수 있는 범용 필터링 도구입니다.

728x90
반응형
Comments