본문으로 건너뛰기

pandas 100제: 판다스 연습문제와 풀이 · 5장

031–040 조건으로 거르기

불리언 인덱싱, &·| 조건, isin, ~, query, between, str.contains, np.where 연습문제

7분 읽기

이 장의 목차 13개

조건에 맞는 행만 남기는 필터링 문제입니다. 준비 코드에 합계 total이 들어 있습니다.

수학 80점 이상 조건이 True/False 마스크를 거쳐 행을 고르는 과정
수학 80점 이상 조건이 True/False 마스크를 거쳐 행을 고르는 과정

df["math"] >= 80은 표를 거르지 않습니다. 행마다 True/False가 든 Series(불리언 마스크)를 만들 뿐입니다. 이 마스크를 df[ ] 안에 넣으면 True인 행만 남고, 원래 인덱스는 그대로 유지됩니다. 조건 두 개를 묶을 때 and/or 대신 &와 |를 쓰고, 조건마다 괄호를 치는 이유도 이 마스크끼리 칸별로 계산하기 때문입니다.

준비 코드와 데이터

노트북 첫 셀에 아래 준비 코드를 붙여 넣어 실행한 뒤 문제를 푸세요.

Pythonimport pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '강도윤', '윤하은', '임시우'],
    'class': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B'],
    'kor': [85, 92, 58, 77, 66, 90, 73, 81],
    'eng': [78, 88, 64, 95, 59, 70, 82, 91],
    'math': [92, 75, 49, 88, 71, 66, 95, 60],
})
df['total'] = df['kor'] + df['eng'] + df['math']

이 장 실습 노트북 내려받기 (.ipynb) — 준비 코드와 문제가 들어 있고 답 칸은 비어 있습니다. 코랩에서는 파일 → 노트 업로드로 엽니다.

준비 코드를 실행하면 df는 다음 표가 됩니다(8행 × 6열, 맨 왼쪽 숫자는 인덱스).

결과     name class  kor  eng  math  total
0  김민준     A   85   78    92    255
1  이서연     B   92   88    75    255
2  박지호     A   58   64    49    171
3  최수아     C   77   95    88    260
4  정민서     B   66   59    71    196
5  강도윤     C   90   70    66    226
6  윤하은     A   73   82    95    250
7  임시우     B   81   91    60    232

장 안의 문제는 번호 순서대로 이어집니다. 앞 문제에서 만든 열이나 변수를 다음 문제가 쓸 수 있으니, 중간부터 풀 때는 준비 코드와 앞의 필요한 문제를 먼저 실행하세요.

031. 조건 하나

수학 80점 이상인 학생을 고르세요.

힌트 보기

df[조건식] — 조건식은 df["math"] >= 80입니다.

정답 보기
Pythondf[df['math'] >= 80]
결과     name class  kor  eng  math  total
0  김민준     A   85   78    92    255
3  최수아     C   77   95    88    260
6  윤하은     A   73   82    95    250

풀이: 비교식은 행별 참·거짓 Series를 만들고 대괄호가 참인 행만 남깁니다.

032. 그리고 조건

A반이면서 영어 70점 이상인 학생을 고르세요.

힌트 보기

두 조건을 각각 괄호로 감싸고 &로 잇습니다. 파이썬의 and는 여기서 오류가 납니다.

정답 보기
Pythondf[(df['class'] == 'A') & (df['eng'] >= 70)]
결과     name class  kor  eng  math  total
0  김민준     A   85   78    92    255
6  윤하은     A   73   82    95    250

풀이: &는 두 조건을 모두 만족하는 행을 선택합니다. 각 비교식의 괄호를 생략하지 않습니다.

조건마다 괄호로 감싸야 합니다.

033. 또는 조건

국어나 수학 중 하나라도 60점 미만인 학생을 고르세요.

힌트 보기

"또는"은 | 연산자입니다. 이때도 조건마다 괄호가 필요합니다.

정답 보기
Pythondf[(df['kor'] < 60) | (df['math'] < 60)]
결과     name class  kor  eng  math  total
2  박지호     A   58   64    49    171

풀이: |는 하나 이상의 조건을 만족하면 참입니다. 두 조건에 모두 맞아도 행은 한 번만 나옵니다.

034. 여러 값 중 하나

A반 또는 C반 학생의 name, class를 고르세요.

힌트 보기

여러 값 중 하나인지 볼 때는 isin(["A", "C"]).

정답 보기
Pythondf[df['class'].isin(['A', 'C'])][['name', 'class']]
결과     name class
0  김민준     A
2  박지호     A
3  최수아     C
5  강도윤     C
6  윤하은     A

풀이: isin은 목록에 든 값인지 검사합니다. 그 뒤 결과에서 필요한 열만 선택합니다.

035. 조건 뒤집기

B반이 아닌 학생의 이름을 고르세요.

힌트 보기

조건 앞에 ~를 붙이면 참과 거짓이 뒤집힙니다. 이 문제는 !=로도 풀 수 있습니다.

정답 보기
Pythondf[~(df['class'] == 'B')]['name']
결과0    김민준
2    박지호
3    최수아
5    강도윤
6    윤하은
Name: name, dtype: str

풀이: 부정 연산은 괄호 안의 불리언 결과 전체에 적용합니다.

~는 참·거짓을 뒤집습니다.

pandas 2.x에서는 마지막 줄이 dtype: object로 보입니다. 값은 같습니다.

036. query로 거르기

국어 점수가 영어 점수보다 높은 학생을 query로 고르세요.

힌트 보기

df.query("조건 문자열") — 문자열 안에서는 열 이름을 따옴표 없이 씁니다.

정답 보기
Pythondf.query('kor > eng')
결과     name class  kor  eng  math  total
0  김민준     A   85   78    92    255
1  이서연     B   92   88    75    255
4  정민서     B   66   59    71    196
5  강도윤     C   90   70    66    226

풀이: query 문자열에서는 열 이름을 직접 씁니다. 외부 사용자 입력을 그대로 query로 실행하지 않습니다.

037. 범위 안의 값

합계가 220점 이상 250점 이하인 학생을 고르세요.

힌트 보기

between(작은 값, 큰 값)은 양 끝을 포함합니다.

정답 보기
Pythondf[df['total'].between(220, 250)]
결과     name class  kor  eng  math  total
5  강도윤     C   90   70    66    226
6  윤하은     A   73   82    95    250
7  임시우     B   81   91    60    232

풀이: between은 기본적으로 양 끝을 포함하므로 220과 250도 선택합니다.

between은 양 끝을 포함합니다.

038. 글자가 들어간 행

이름에 '민'이 들어간 학생을 고르세요.

힌트 보기

문자열 열에는 .str을 붙이고 contains("민").

정답 보기
Pythondf[df['name'].str.contains('민')]
결과     name class  kor  eng  math  total
0  김민준     A   85   78    92    255
4  정민서     B   66   59    71    196

풀이: contains는 부분 문자열을 찾으며 기본적으로 정규식을 사용합니다. 일반 텍스트 검색은 regex=False도 고려합니다.

039. 조건에 맞는 개수

수학 80점 이상인 학생은 몇 명인가요?

힌트 보기

조건식 자체가 True/False Series입니다. 여기에 .sum()을 하면 True의 개수가 됩니다.

정답 보기
Python(df['math'] >= 80).sum()
결과np.int64(3)

풀이: 참의 개수를 세는 합계입니다. 선택한 점수 자체를 더하는 것과 다릅니다.

True는 1로 계산됩니다.

040. 조건으로 값 정하기

합계 240점 이상이면 합격, 아니면 불합격인 result 열을 만들고 name, total, result를 보이세요.

힌트 보기

np.where(조건, 참일 때 값, 거짓일 때 값)으로 새 열을 만듭니다.

정답 보기
Pythondf['result'] = np.where(df['total'] >= 240, '합격', '불합격')
df[['name', 'total', 'result']]
결과     name  total  result
0  김민준    255    합격
1  이서연    255    합격
2  박지호    171  불합격
3  최수아    260    합격
4  정민서    196  불합격
5  강도윤    226  불합격
6  윤하은    250    합격
7  임시우    232  불합격

풀이: np.where는 행별 조건에 따라 두 문자열 중 하나를 선택하며 결과를 새 열에 저장합니다.

이 장 요약

문법하는 일문제
df[df["열"] >= 값]조건에 맞는 행만031
df[(조건1) & (조건2)]두 조건 모두(조건마다 괄호)032
파이프 기호로 묶기조건 중 하나라도(또는)033
s.isin([...])목록 중 하나인가034
df[~조건]조건 뒤집기035
df.query("kor > eng")문자열로 조건 쓰기036
s.between(a, b)a 이상 b 이하037
s.str.contains("글자")글자가 들어 있나038
조건.sum()조건에 맞는 개수039
np.where(조건, 참값, 거짓값)조건으로 값 정하기040

이 장의 점검

두 조건을 괄호로 묶었는지, 경계값을 포함했는지 확인하세요. 글자 조건에서 결측치가 있으면 처리 정책도 필요합니다.

참고: pandas 공식 문서 · 문법이 기억나지 않으면 부록 치트시트를 찾아보세요.

전체 메뉴