pandas 100제: 판다스 연습문제와 풀이 · 5장
031–040 조건으로 거르기
불리언 인덱싱, &·| 조건, isin, ~, query, between, str.contains, np.where 연습문제
이 장의 목차 13개
조건에 맞는 행만 남기는 필터링 문제입니다. 준비 코드에 합계 total이 들어 있습니다.
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 공식 문서 · 문법이 기억나지 않으면 부록 치트시트를 찾아보세요.