pandas 100제: 판다스 연습문제와 풀이 · 4장
021–030 열과 행 선택하기
열 선택, loc, iloc, at, drop, 새 열 추가, 열 순서 바꾸기 연습문제
이 장의 목차 13개
원하는 열과 행만 꺼내는 연습입니다. 28번부터는 df에 열을 추가하고, 그 뒤 문제가 이어서 씁니다.
![iloc[:3, 1:3]과 loc[0:2, [name, kor]]가 고르는 칸을 색으로 표시한 그림](/static/books/pandas-100/loc-iloc.svg?v=c08679b2)
pandas에서 가장 많이 헷갈리는 부분입니다. iloc은 0부터 세는 위치 번호로 고르고, 파이썬 슬라이스처럼 끝 번호는 빠집니다. loc은 인덱스 라벨과 열 이름으로 고르고, 끝 라벨까지 포함합니다. 기본 인덱스(0, 1, 2…)에서는 둘이 같아 보이지만, 정렬하거나 거른 뒤에는 라벨과 위치가 어긋나므로 어떤 기준으로 고르는지 늘 의식하세요.
준비 코드와 데이터
노트북 첫 셀에 아래 준비 코드를 붙여 넣어 실행한 뒤 문제를 푸세요.
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],
})
이 장 실습 노트북 내려받기 (.ipynb) — 준비 코드와 문제가 들어 있고 답 칸은 비어 있습니다. 코랩에서는 파일 → 노트 업로드로 엽니다.
준비 코드를 실행하면 df는 다음 표가 됩니다(8행 × 5열, 맨 왼쪽 숫자는 인덱스).
결과 name class kor eng math
0 김민준 A 85 78 92
1 이서연 B 92 88 75
2 박지호 A 58 64 49
3 최수아 C 77 95 88
4 정민서 B 66 59 71
5 강도윤 C 90 70 66
6 윤하은 A 73 82 95
7 임시우 B 81 91 60
장 안의 문제는 번호 순서대로 이어집니다. 앞 문제에서 만든 열이나 변수를 다음 문제가 쓸 수 있으니, 중간부터 풀 때는 준비 코드와 앞의 필요한 문제를 먼저 실행하세요.
021. 열 하나 꺼내기
name 열을 Series로 꺼내세요.
힌트 보기
대괄호에 열 이름 하나: df["열"].
정답 보기
Pythondf['name']
결과0 김민준
1 이서연
2 박지호
3 최수아
4 정민서
5 강도윤
6 윤하은
7 임시우
Name: name, dtype: str
풀이: 대괄호 한 번으로 열 하나를 선택하면 1차원 Series가 됩니다.
pandas 2.x에서는 마지막 줄이 dtype: object로 보입니다. 값은 같습니다.
022. 여러 열 꺼내기
name과 math 두 열을 DataFrame으로 꺼내세요.
힌트 보기
대괄호 안에 열 이름 리스트를 넣습니다. 그래서 대괄호가 두 겹이 됩니다.
정답 보기
Pythondf[['name', 'math']]
결과 name math
0 김민준 92
1 이서연 75
2 박지호 49
3 최수아 88
4 정민서 71
5 강도윤 66
6 윤하은 95
7 임시우 60
풀이: 열 이름 리스트를 대괄호 안에 넣으면 여러 열을 가진 DataFrame이 됩니다.
대괄호를 두 번 쓰면 DataFrame입니다.
023. loc로 한 행
인덱스 라벨이 2인 학생의 정보(행 전체)를 보이세요.
힌트 보기
df.loc[행 라벨].
정답 보기
Pythondf.loc[2]
결과name 박지호
class A
kor 58
eng 64
math 49
Name: 2, dtype: object
풀이: loc[2]는 라벨이 2인 행 전체를 Series로 반환합니다. 위치가 세 번째라는 뜻은 아닙니다.
024. iloc로 범위
처음 3행의 두 번째·세 번째 열(class, kor)을 위치 번호로 꺼내세요.
힌트 보기
df.iloc[행 범위, 열 범위] — 위치는 0부터 세고, 범위의 끝 번호는 빠집니다. class는 1번, kor는 2번 열입니다.
정답 보기
Pythondf.iloc[:3, 1:3]
결과 class kor
0 A 85
1 B 92
2 A 58
풀이: iloc의 첫 부분은 행 위치, 두 번째 부분은 열 위치입니다.
iloc의 끝 번호는 포함되지 않습니다.
025. loc로 행과 열
인덱스 라벨 0~2 학생의 name, kor를 라벨로 꺼내세요.
힌트 보기
df.loc[행 라벨 범위, [열 이름들]] — loc의 범위는 끝 라벨도 포함합니다.
정답 보기
Pythondf.loc[0:2, ['name', 'kor']]
결과 name kor
0 김민준 85
1 이서연 92
2 박지호 58
풀이: loc는 인덱스 라벨 기준이며 이 표에서는 0·1·2 라벨을 모두 포함합니다.
loc에 이름으로 범위를 주면 끝(2)까지 포함합니다.
026. 값 하나 꺼내기
인덱스 3 학생의 영어 점수 하나만 꺼내세요.
힌트 보기
값 하나만 빠르게 꺼낼 때는 df.at[행 라벨, "열 이름"].
정답 보기
Pythondf.at[3, 'eng']
결과np.int64(95)
풀이: 3이라는 행 라벨과 eng라는 열 라벨의 교차점에서 스칼라 하나를 읽습니다.
at은 행·열 라벨을 지정해 값 하나를 꺼낼 때 쓰는 접근자입니다.
027. 열 지우기
class 열을 뺀 표의 앞 3행을 보이세요.
힌트 보기
drop(columns="열 이름").
정답 보기
Pythondf.drop(columns='class').head(3)
결과 name kor eng math
0 김민준 85 78 92
1 이서연 92 88 75
2 박지호 58 64 49
풀이: columns로 삭제 축을 명시합니다. 반환값을 저장하지 않으면 원본 열은 남습니다.
028. 새 열 만들기
세 과목 합계 열 total을 추가하고 앞 3행을 보이세요.
힌트 보기
df["새 열"] = 계산식처럼 대입하면 열이 생깁니다. 같은 행의 값끼리 더해집니다.
정답 보기
Pythondf['total'] = df['kor'] + df['eng'] + df['math']
df.head(3)
결과 name class kor eng math total
0 김민준 A 85 78 92 255
1 이서연 B 92 88 75 255
2 박지호 A 58 64 49 171
풀이: 같은 행의 세 점수를 더해 새 열에 저장합니다. 다음 문항도 이 열을 사용합니다.
029. 계산 열 추가
평균 열 avg(소수 첫째 자리 반올림)를 추가하고 name, total, avg를 보이세요.
힌트 보기
df["total"] / 3에 .round(1)을 붙입니다.
정답 보기
Pythondf['avg'] = (df['total'] / 3).round(1)
df[['name', 'total', 'avg']]
결과 name total avg
0 김민준 255 85.0
1 이서연 255 85.0
2 박지호 171 57.0
3 최수아 260 86.7
4 정민서 196 65.3
5 강도윤 226 75.3
6 윤하은 250 83.3
7 임시우 232 77.3
풀이: 행별 합계를 과목 수 3으로 나눈 뒤 round(1)로 소수 첫째 자리까지 표시합니다.
030. 열 순서 바꾸기
class, name, avg 순서로 열을 골라 앞 3행을 보이세요.
힌트 보기
원하는 순서대로 열 이름 리스트를 씁니다.
정답 보기
Pythondf[['class', 'name', 'avg']].head(3)
결과 class name avg
0 A 김민준 85.0
1 B 이서연 85.0
2 A 박지호 57.0
풀이: 열 이름 리스트의 순서가 결과 열의 순서가 됩니다. 앞 문제의 avg 열이 필요합니다.
이 장 요약
| 문법 | 하는 일 | 문제 |
|---|---|---|
df["열"] | 열 하나 → Series | 021 |
df[["열1", "열2"]] | 여러 열 → DataFrame | 022 |
df.loc[라벨] | 라벨로 행 하나 | 023 |
df.iloc[행 위치, 열 위치] | 위치로 고르기(끝 미포함) | 024 |
df.loc[행 라벨, [열 이름]] | 라벨로 고르기(끝 포함) | 025 |
df.at[라벨, "열"] | 값 하나 | 026 |
df.drop(columns="열") | 열 빼기(새 표 반환) | 027 |
df["새 열"] = 식 | 열 추가·덮어쓰기 | 028–029 |
이 장의 점검
loc의 라벨과 iloc의 위치, 끝값 포함 여부를 비교하세요. 028~030번은 앞 문제에서 추가한 열을 이어 씁니다.
참고: pandas 공식 문서 · 문법이 기억나지 않으면 부록 치트시트를 찾아보세요.