pandas 100제: 판다스 연습문제와 풀이 · 2장
001–010 Series와 DataFrame 만들기
pd.Series, pd.DataFrame 생성, 인덱스 지정, shape, rename, set_index 연습문제
이 장의 목차 13개
pandas의 두 기본 자료구조인 Series(한 줄짜리 자료)와 DataFrame(표)을 직접 만들어 봅니다. 아직 실습 환경이 없다면 앞의 시작하기 장에서 구글 코랩부터 준비하세요.
DataFrame은 같은 인덱스를 공유하는 Series 여러 개를 옆으로 나란히 붙인 표라고 생각하면 쉽습니다. 행에 붙는 이름표가 인덱스(index), 열에 붙는 이름표가 열 이름(columns)이고, 열 하나를 꺼내면 그 열의 값과 인덱스를 가진 Series가 됩니다. 한 열 안의 값은 모두 같은 자료형(dtype)으로 저장됩니다.
준비 코드와 데이터
이 장은 준비 데이터 없이 시작합니다. 아래 두 줄을 먼저 실행하고, 005번에서 만든 df를 이후 문제가 이어서 씁니다.
Pythonimport pandas as pd
import numpy as np
이 장 실습 노트북 내려받기 (.ipynb) — 준비 코드와 문제가 들어 있고 답 칸은 비어 있습니다. 코랩에서는 파일 → 노트 업로드로 엽니다.
장 안의 문제는 번호 순서대로 이어집니다. 앞 문제에서 만든 열이나 변수를 다음 문제가 쓸 수 있으니, 중간부터 풀 때는 준비 코드와 앞의 필요한 문제를 먼저 실행하세요.
001. 리스트로 Series 만들기
리스트 [10, 20, 30, 40]으로 Series를 만드세요.
힌트 보기
pd.Series() 괄호 안에 리스트를 그대로 넣습니다.
정답 보기
Pythonpd.Series([10, 20, 30, 40])
결과0 10
1 20
2 30
3 40
dtype: int64
풀이: 리스트의 값이 순서대로 들어가고 기본 정수 인덱스가 붙습니다.
인덱스를 정하지 않으면 0부터 번호가 붙습니다.
002. 인덱스를 지정한 Series
값 [3, 5, 2]에 인덱스 사과, 배, 귤을 붙인 Series를 만드세요.
힌트 보기
pd.Series(값 리스트, index=인덱스 리스트) 형태입니다. 두 리스트의 길이가 같아야 합니다.
정답 보기
Pythonpd.Series([3, 5, 2], index=['사과', '배', '귤'])
결과사과 3
배 5
귤 2
dtype: int64
풀이: 값과 인덱스의 개수를 맞추면 과일 이름으로 값을 조회할 수 있습니다.
003. 딕셔너리로 Series 만들기
딕셔너리 {"사과": 1200, "바나나": 800, "딸기": 3000}으로 Series를 만들고 이름을 price로 정하세요.
힌트 보기
딕셔너리를 넣으면 키가 인덱스가 됩니다. Series의 이름은 name= 인자로 정합니다.
정답 보기
Pythonpd.Series({'사과': 1200, '바나나': 800, '딸기': 3000}, name='price')
결과사과 1200
바나나 800
딸기 3000
Name: price, dtype: int64
풀이: Series의 name은 값의 이름이고, 과일별 키는 인덱스입니다.
딕셔너리의 키가 인덱스가 됩니다.
004. 가장 큰 값과 그 인덱스
3번의 과일 가격 Series를 변수 price에 담고, 가장 비싼 과일의 이름과 가격을 함께 구하세요.
힌트 보기
최댓값은 max(), 최댓값이 있는 자리의 인덱스는 idxmax()입니다. 쉼표로 두 식을 이어 쓰면 함께 출력됩니다.
정답 보기
Pythonprice = pd.Series({'사과': 1200, '바나나': 800, '딸기': 3000})
price.idxmax(), price.max()
결과('딸기', np.int64(3000))
풀이: 최댓값의 위치를 먼저 찾은 뒤 이름과 가격을 함께 확인합니다. 동점이면 idxmax는 첫 인덱스를 반환합니다. numpy 2 이상에서는 숫자 하나가 np.int64(3000)처럼 자료형과 함께 표시되는데, 값은 그냥 3000입니다.
idxmax는 최댓값의 인덱스를, max는 값을 돌려줍니다.
005. 딕셔너리로 DataFrame 만들기
다음 자료로 DataFrame df를 만드세요. 열 이름은 name, class, kor, eng, math 순서입니다. 이후 문제에서도 같은 표를 사용합니다.
| name | class | kor | eng | math |
|---|---|---|---|---|
| 김민준 | A | 85 | 78 | 92 |
| 이서연 | B | 92 | 88 | 75 |
| 박지호 | A | 58 | 64 | 49 |
| 최수아 | C | 77 | 95 | 88 |
| 정민서 | B | 66 | 59 | 71 |
| 강도윤 | C | 90 | 70 | 66 |
| 윤하은 | A | 73 | 82 | 95 |
| 임시우 | B | 81 | 91 | 60 |
힌트 보기
pd.DataFrame({"열 이름": [값, 값, ...], ...}) — 딕셔너리 하나가 표 하나입니다.
정답 보기
Pythondf = 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
결과 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
풀이: 딕셔너리의 키는 열 이름, 각 리스트는 그 열의 행 값입니다. 리스트 길이는 모두 같아야 합니다.
이후 장의 준비 코드에도 같은 표가 나옵니다.
006. 리스트의 리스트로 DataFrame
[["서울", 9.4], ["부산", 3.3]]을 열 이름 city, value로 DataFrame으로 만드세요.
힌트 보기
안쪽 리스트 하나가 한 행입니다. 열 이름은 columns=[...]로 줍니다.
정답 보기
Pythonpd.DataFrame([['서울', 9.4], ['부산', 3.3]], columns=['city', 'value'])
결과 city value
0 서울 9.4
1 부산 3.3
풀이: 안쪽 리스트 하나가 한 행이며 columns로 각 위치의 열 이름을 지정합니다.
바깥 리스트 하나가 한 행입니다.
007. numpy 배열로 DataFrame
0부터 11까지의 수를 3행 4열로 배치하고 열 이름을 A~D로 정하세요.
힌트 보기
np.arange(12)는 0~11을 만들고, .reshape(행, 열)로 모양을 바꿉니다. 열 이름은 list("ABCD")로 간단히 만들 수 있습니다.
정답 보기
Pythonpd.DataFrame(np.arange(12).reshape(3, 4), columns=list('ABCD'))
결과 A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
풀이: arange의 끝값 12는 제외되므로 0~11, 모두 12개 값을 3×4로 바꿉니다.
008. 행과 열의 개수
df의 행 수와 열 수를 구하세요.
힌트 보기
df.shape는 괄호 없이 쓰는 속성입니다.
정답 보기
Pythondf.shape
결과(8, 5)
풀이: shape는 셀 개수가 아니라 두 축의 길이를 반환합니다.
(행, 열) 순서의 튜플입니다. 행 수만 필요하면 len(df).
009. 열 이름 바꾸기
df의 kor, eng, math를 국어, 영어, 수학으로 바꾼 표를 앞 3행만 보이세요. 원본은 바꾸지 마세요.
힌트 보기
rename(columns={옛 이름: 새 이름, ...}) 뒤에 .head(3)을 이어 씁니다. 결과를 df에 다시 넣지 않으면 원본은 그대로입니다.
정답 보기
Pythondf.rename(columns={'kor': '국어', 'eng': '영어', 'math': '수학'}).head(3)
결과 name class 국어 영어 수학
0 김민준 A 85 78 92
1 이서연 B 92 88 75
2 박지호 A 58 64 49
풀이: rename 결과에 head를 적용합니다. inplace를 지정하지 않아 원본 열 이름을 유지합니다.
rename은 새 표를 돌려주므로 원본 df는 그대로입니다.
010. 열을 인덱스로
name 열을 인덱스로 만든 표의 앞 3행을 보이세요.
힌트 보기
set_index("열 이름").
정답 보기
Pythondf.set_index('name').head(3)
결과 class kor eng math
name
김민준 A 85 78 92
이서연 B 92 88 75
박지호 A 58 64 49
풀이: set_index는 선택한 열을 행 라벨로 옮기며 기본적으로 원래 열 자리에서는 제거합니다.
되돌릴 때는 reset_index()를 씁니다.
이 장 요약
| 문법 | 하는 일 | 문제 |
|---|---|---|
pd.Series(리스트, index=[...]) | 값 목록에 이름표(인덱스)를 붙인 1차원 자료 | 001–002 |
pd.Series(딕셔너리, name=...) | 키가 인덱스, 값이 값 | 003 |
s.idxmax() / s.max() | 최댓값의 인덱스 / 최댓값 | 004 |
pd.DataFrame({열: [값...]}) | 열 단위 자료로 표 만들기 | 005 |
pd.DataFrame(행 리스트, columns=[...]) | 행 단위 자료로 표 만들기 | 006–007 |
df.shape | (행 수, 열 수) | 008 |
df.rename(columns={옛: 새}) | 열 이름 바꾸기(새 표 반환) | 009 |
df.set_index("열") | 열을 인덱스로 옮기기 | 010 |
이 장의 점검
Series와 DataFrame을 구분하고, 기본 인덱스·직접 지정한 인덱스·열 이름을 각각 설명할 수 있나요?
참고: pandas 공식 문서 · 문법이 기억나지 않으면 부록 치트시트를 찾아보세요.