728x90
일반적으로 데이터를 필터링하면 조건에 맞는 행만 추출하게 됩니다. (query(), Boolean Indexing 등)
하지만 때로는 조건을 만족하는 값은 유지하고, 만족하지 않는 값은 다른 값으로 바꿔야 하는 경우가 있습니다.
예를 들어:
- 점수가 70점이상이면 그대로 두고, 70 미만이면 '재시험'이라고 표시
- 결측치는 그래도 두고, 음수 값만 0으로 치환
- 특정 범위를 벗어난 값만 수정
이럴 때 Pandas의 where() 함수가 진가를 발휘합니다.
예제 데이터
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'score': [85, 67, 90, 45]
})
기본 문법
DataFrame.where(cond, other=NaN, inplace=False)
Series.where(cond, other=NaN, inplace=False)
- cond : True / False 조건
- other : 조건이 False일 때 바꿀 값
- inplace : True 설정 시 원본 수정
1. 예제: 70점 이상은 유지, 아니면 '재시험'
df['result'] = df['score'].where(df['score'] >= 70, other='재시험')
→ 조건을 만족하는 곳은 원래 값 유지, 아니면 '재시험'으로 치환
2. 예제: 음수 값만 0으로 수정
data = pd.Series([10, -5, 15, -2, 20])
data_fixed = data.where(data >= 0, other=0)
3. 예제: 다중 조건 처리
df['pass'] = df['score'].where((df['score'] >= 70) & (df['score'] <= 100), other='불합격')
→ 70 이상 100 이하인 경우만 통과, 나머지는 '불합격'
4. 예제: 결측치(NaN)는 건드리지 않고 음수만 수정
s = pd.Series([10, np.nan, -5, 20])
s_fixed = s.where((s >= 0) | (s.isna()), other=0)
→ 0 이하인 값은 전부 0으로 치환 (음수/0 제거 패턴)
주의사항
이슈 | 설명 |
where()는 필터링이 아니다 | 행을 삭제하지 않음, 값을 변경하는 것임 |
기본 other=NaN | 조건이 False면 NaN이 들어간다 (별도 지정 필요) |
조건 제대로 확인해야 함 | 반대로 쓰면 원치 않은 결과 나올 수 있음 |
Pandas의 where()는 필터링이 아니라 수정이빈다.
조건을 만족하면 살리고, 만족하지 않으면 바꾼다는 패턴을 기억해야합니다.
복잡한 데이터 전처리, 품질 검사, 이상치 수정 등에 where()는 매우 강력한 무기가 될 수 있습니다.
728x90
반응형
'python > Pandas | Numpy' 카테고리의 다른 글
[Numpy] percentile() - 백분위수 구하기 (0) | 2025.05.02 |
---|---|
[Pandas] clip() - 이상값 방어의 핵심 (0) | 2025.05.02 |
[Pandas] applymap() - DataFrame 전체 셀에 함수를 적용 (0) | 2025.04.29 |
[Pandas] map() (조건 라벨링, 값 변환, 딕셔너리 매핑까지 Series 변환의 핵심) (0) | 2025.04.24 |
[Pandas] explode() (리스트가 들어있는 셀 행마다 분해) (1) | 2025.04.24 |