본문으로 건너뛰기

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

021–030 열과 행 선택하기

열 선택, loc, iloc, at, drop, 새 열 추가, 열 순서 바꾸기 연습문제

7분 읽기

이 장의 목차 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["열"]열 하나 → Series021
df[["열1", "열2"]]여러 열 → DataFrame022
df.loc[라벨]라벨로 행 하나023
df.iloc[행 위치, 열 위치]위치로 고르기(끝 미포함)024
df.loc[행 라벨, [열 이름]]라벨로 고르기(끝 포함)025
df.at[라벨, "열"]값 하나026
df.drop(columns="열")열 빼기(새 표 반환)027
df["새 열"] = 식열 추가·덮어쓰기028–029

이 장의 점검

loc의 라벨과 iloc의 위치, 끝값 포함 여부를 비교하세요. 028~030번은 앞 문제에서 추가한 열을 이어 씁니다.

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

전체 메뉴