본문으로 건너뛰기

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

001–010 Series와 DataFrame 만들기

pd.Series, pd.DataFrame 생성, 인덱스 지정, shape, rename, set_index 연습문제

8분 읽기

이 장의 목차 13개

pandas의 두 기본 자료구조인 Series(한 줄짜리 자료)와 DataFrame(표)을 직접 만들어 봅니다. 아직 실습 환경이 없다면 앞의 시작하기 장에서 구글 코랩부터 준비하세요.

DataFrame의 구조 — 인덱스, 열 이름, 한 열(Series)
DataFrame의 구조 — 인덱스, 열 이름, 한 열(Series)

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 순서입니다. 이후 문제에서도 같은 표를 사용합니다.

nameclasskorengmath
김민준A857892
이서연B928875
박지호A586449
최수아C779588
정민서B665971
강도윤C907066
윤하은A738295
임시우B819160
힌트 보기

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 공식 문서 · 문법이 기억나지 않으면 부록 치트시트를 찾아보세요.

전체 메뉴