데이터 분석에서 우리가 가장 먼저 하고 싶은 건 "내가 원하는 조건에 맞는 데이터만 뽑아보기"다.
이때 Pandas에서는 Boolean Indexing이라는 강력한 기능을 제공한다.
조건에 맞는 행(row)만 필터링하는 이 방식은 단순한 것 같지만,
조금만 복잡해져도 괄호 문제, 논리 연산자 오류, 결측치 때문에 자주 실수하게 된다.
Boolean Indexing
Boolean Indexing은 조건식을 통해 True/False 마스크를 생성하고,
이 마스크를 통해 원하는 행만 필터링하는 방식이다.
우선 df를 만들어서 사용 예제를 확인해하겠습니다.
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 40],
'score': [88, 92, 85, 70]
})
df[df['age'] > 30]
위 코드는 age가 30보다 큰 사람만 필터링한다.
단일 조건 필터링
df[df['score'] >= 90]
→ score가 90 이상인 사람만 출력
다중 조건 필터링 – AND (&), OR (|)
df[(df['age'] > 30) & (df['score'] >= 85)]
df[(df['name'] == 'Alice') | (df['score'] < 80)]
주의: 반드시 조건식을 괄호로 감싸야 한다.
&, |는 Python의 기본 and, or과 다르게 작동하며, Pandas에서는 괄호 필수!
문자열 조건 필터링
df[df['name'].str.contains('a', case=False)]
→ 이름에 'a'가 포함된 행만 추출 (대소문자 무시)
isin() – 여러 값 중 포함 여부 체크
df[df['name'].isin(['Alice', 'David'])]
→ 이름이 Alice 또는 David인 사람만 추출
notna() – 결측치(NaN) 제거 조건
df[df['score'].notna()]
실무에서는 종종 score 컬럼에 NaN이 있을 수 있으니, 분석 전에 notna로 걸러주는 게 안전하다.
between() – 범위 조건 필터링
df[df['age'].between(30, 40)]
→ age가 30 이상 40 이하인 행만 추출
예제: 30대 중 점수가 85 이상인 사용자
df[(df['age'] >= 30) & (df['age'] < 40) & (df['score'] >= 85)]
자주 하는 실수
[오류] 괄호 없이 & 또는 | 사용
df[df['age'] > 30 & df['score'] > 85] # 오류 발생
[성공] 올바른 작성
df[(df['age'] > 30) & (df['score'] > 85)]
실수 방지를 위해 조건마다 괄호를 친다고 습관 들이는 것이 좋다.
필터링 결과 컬럼 선택까지 함께 하기
df.loc[(df['score'] >= 85), ['name', 'score']]
→ 조건에 맞는 행의 일부 열만 가져오는 실무 패턴
Boolean Indexing은 Pandas에서 가장 많이 쓰이는 기능이지만,
기초 문법을 모른 채 실무에 쓰면 괄호 오류, 타입 오류 등으로 쉽게 무너진다.
&, |, isin(), between(), notna() 등을 숙지하면
어지간한 필터링 조건은 다 커버할 수 있다.
'python > Pandas | Numpy' 카테고리의 다른 글
[Pandas] 데이터 타입 확인 및 변환 – dtypes, astype() (0) | 2025.04.24 |
---|---|
[Pandas] 결측치(NaN) 처리 (0) | 2025.04.24 |
[Pandas] 정렬과 순위 매기기 – sort_values, rank (0) | 2025.04.24 |
[Pandas] 인덱싱 – loc vs iloc (0) | 2025.04.24 |
[Pandas] Series와 DataFrame (0) | 2025.04.24 |