Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

15 판다스 시리즈

Updated: 18 mrt 2026

판다스Pandas는 넘파이와 함께 데이터 분석에서 가장 많이 활용되는 라이브러리다. 판다스가 제공하는 두 개의 자료형 SeriesDataFrame은 데이터를 매우 효율적으로 다루는 다양한 기능을 제공한다.

넘파이 어레이는 다차원 수치형 데이터를 처리하는 데에 특화된 반면, 판다스의 시리즈와 데이터프레임은 표table 형식으로 제공되는 모든 유형의 2차원 데이터를 다룰 수 있다.

아래 이미지는 Mango, Apple, Banana 세 개의 과일 이름으로 구성된 열과 날짜별 과일 종류별 개수로 구성된 5개의 행으로 구성된 엑셀 표를 보여준다.

판다스 라이브러리의 Series 객체는 위 표의 각 열을, Dataframe 객체는 위 표 전체를 효율적으로 다룰 수 있다.

여기서는 먼저 시리즈를, 다음 장에서 데이터프레임을 소개한다.

기본 설정

numpypandas 라이브러리를 각각 nppd로 불러온다.

import numpy as np
import pandas as pd

데이터셋 저장소

data_url = 'https://raw.githubusercontent.com/codingalzi/code-workout-datasci/refs/heads/master/data/'

15.1시리즈 생성

시리즈는 1차원 어레이와 동일한 구조를 갖는다. 다만 인덱스를 0, 1, 2..가 아닌 원하는 값으로 지정할 수 있다. 시리즈를 생성하기 위해 리스트, 넘파이 1차원 어레이, 사전 등을 이용한다.

리스트 활용

리스트 또는 1차원 어레이를 이용하여 간단하게 시리즈를 생성할 수 있다. dtype은 어레이 항목의 자료형을 가리키는 것처럼 시리즈에 포함된 항목들의 자료형을 의미한다.

아래 코드는 리스트를 이용하여 위 그림의 표의 각 열에 대응하는 시리즈 객체를 생성한다. 시리즈를 정의할 때 사용되는 name 매개변수는 시리즈의 이름을 지정한다. 시리즈 이름의 기능은 나중에 데이터프레임을 생성할 때 유용하게 사용된다.

series1 = pd.Series([4, 5, 6, 3, 1], name="Mango")
series2 = pd.Series([5, 4, 3, 0, 2], name="Apple")
series3 = pd.Series([2, 3, 5, 2, 7], name="Banana")

예를 들어 망고 데이터를 담은 series1을 확인해보자.

series1
0 4 1 5 2 6 3 3 4 1 Name: Mango, dtype: int64

마치 하나의 열로 구성된 표을 담은 엑셀파일처럼 0부터 시작하는 행 인덱스와 함께 시리즈의 각 항목이 세로로 정렬된 형식으로 보여진다. 행 인덱스는 시리즈를 생성할 때 별도로 지정하지 않으면 0부터 시작하는 정수 인덱스가 사용된다 행 인덱스는 또한 1차원 어레이와 유사한 방식으로 시리즈 인덱싱과 슬라이싱에 활용된다.

시리즈 객체의 자료형은 다음과 같다.

type(series1)
pandas.Series

시리즈는 1차원이다.

series1.ndim
1

어레이 활용

넘파이 1차원 어레이를 이용해 동일한 방식으로 시리즈를 생성할 수 있다.

series1 = pd.Series(np.array([4, 5, 6, 3, 1]), name="Mango")
series2 = pd.Series(np.array([5, 4, 3, 0, 2]), name="Apple")
series3 = pd.Series(np.array([2, 3, 5, 2, 7]), name="Banana")

앞서 리스트를 이용한 경우와 동일한 시리즈 객체를 생성한다. 예를 들어 series2를 확인해보자.

series2
0 5 1 4 2 3 3 0 4 2 Name: Apple, dtype: int64

사전 활용

사전을 이용하여 시리즈를 생성할 수 있다. 사전의 키가 인덱스로 지정되며, 따라서 아래 코드는 이전과 동일한 세 개의 시리즈 객체를 생성한다.

dic1 = {0: 4, 1: 5, 2: 6, 3: 3, 4: 1}
dic2 = {0: 5, 1: 4, 2: 3, 3: 0, 4: 2}
dic3 = {0: 2, 1: 3, 2: 5, 3: 2, 4: 7}

series1 = pd.Series(dic1, name="Mango")
series2 = pd.Series(dic2, name="Apple")
series3 = pd.Series(dic3, name="Banana")

예를 들어 series3를 확인해보자.

series3
0 2 1 3 2 5 3 2 4 7 Name: Banana, dtype: int64

그런데 사전의 키를 바꾸면 인덱스가 달라진다.

dic1 = {'첫째': 4, '둘째': 5, '셋째': 6, '넷째': 3, '다섯째': 1}
dic2 = {'첫째': 5, '둘째': 4, '셋째': 3, '넷째': 0, '다섯째': 2}
dic3 = {'첫째': 2, '둘째': 3, '셋째': 5, '넷째': 2, '다섯째': 7}

series1_count = pd.Series(dic1, name="Mango")
series2_count = pd.Series(dic2, name="Apple")
series3_count = pd.Series(dic3, name="Banana")

예를 들어 series1을 확인하면 인덱스가 달라졌음이 확인된다.

series1_count
첫째 4 둘째 5 셋째 6 넷째 3 다섯째 1 Name: Mango, dtype: int64

이처럼 넘파이 1차원 어레이와 시리즈는 아래 두 가지 점에서 다르다.

  1. 행 인덱스를 원하는 방식으로 지정할 수 있다.

  2. 데이터의 특성을 name과 같은 객체 속성으로 지정할 수 있다.

15.1.1연습문제

(1) 아래 리스트를 이용하여 시리즈를 생성하시오. 단, np.nan은 결측치, 즉 값이 없어서 비어있는 자리를 표현하는 부동소수점 값이다.

aList = [1, 3, 5, 6, 8]

답:

pd.Series(aList)
0 1 1 3 2 5 3 6 4 8 dtype: int64

15.2시리즈 속성

시리즈는 넘파이 어레이보다 많은 속성을 객체 자체에 저장한다.

index 속성

index 속성은 행 인덱스로 사용된 값들로 구성된 Index 객체를 가리킨다. 자동으로 생성된 정수 인덱스는 range 객체와 유사하게 작동하는 RangeIndex 객체로 지정된다. 참고로 RangeIndex 클래스는 Index 클래스의 자식클래스다.

series1.index
RangeIndex(start=0, stop=5, step=1)

정수 인덱스가 아니면 행 인덱스 사용된 값들로 구성된 Index 객체로 지정되며, 어레이처럼 dtype을 이용하여 인덱스로 사용된 값들의 자료형을 명시한다.

series1_count.index
Index(['첫째', '둘째', '셋째', '넷째', '다섯째'], dtype='str')

index 속성을 임의의 값으로 지정할 수 있다. 단, 항목의 개수와 동일한 길이의 리스트를 이용해야 한다.

new_index = ['영', '일', '이', '삼', '사']
series1_count.index = new_index
series1_count
영 4 일 5 이 6 삼 3 사 1 Name: Mango, dtype: int64

시리즈를 정의할 때 index 매개변수의 키워드 인자를 이용하여 원하는 행 인덱스를 지정할 수도 있다. 단, 항목의 수와 동일한 길이를 갖는 리스트를 활용해야 한다.

series1 = pd.Series([4, 5, 6, 3, 1], index=new_index, name="Mango")
series1
영 4 일 5 이 6 삼 3 사 1 Name: Mango, dtype: int64
series1.index
Index(['영', '일', '이', '삼', '사'], dtype='str')

name 속성

시리즈 객체는 두 종류의 name 속성을 활용한다.

  • 앞서 사용한 시리즈 항목들의 특성을 가리키는 속성

  • 시리즈 인덱스에 사용된 값들의 특성을 가리키는 속성

시리즈 객체의 name 속성

Series 객체를 생성할 때, 또는 생성 이후에 name 속성에 시리즈에 포함된 데이터를 대변하는 이름을 지정할 수 있다. 아래 코드는 series2name 속성을 'Apple'에서 '사과'로 변경한다.

series2.name = "사과"

아래 코드는 시리즈의 이름이 변경되었을 보여준다.

series2
0 5 1 4 2 3 3 0 4 2 Name: 사과, dtype: int64

시리즈의 인덱스 객체의 name 속성

시리즈의 인덱스 객체도 name 속성을 가질 수 있다. 이 속성은 시리즈에 포함된 값들의 이름이 아니라, 행 인덱스로 사용된 값들이 용도를 설명한다. 예를 들어 날짜, 학생 이름, 지역명 등이 행 인덱스로 사용될 때 인덱스의 이름을 각각 날짜, 학생, 지역 등으로 지정할 수 있다.

series2.index.name = "순번"
series2
순번 0 5 1 4 2 3 3 0 4 2 Name: 사과, dtype: int64

values 속성

values 속성은 시리즈의 항목만으로 구성된 1차원 어레이를 가리킨다. 이처럼 판다스 시리즈는 넘파이 1차원 어레이를 기본 저장장치로 활용한다.

series1.values
array([4, 5, 6, 3, 1])
series2.values
array([5, 4, 3, 0, 2])
series3.values
array([2, 3, 5, 2, 7])

15.2.1연습문제

(1)

15.3시리즈 인덱싱과 슬라이싱

시리즈의 인덱싱과 슬라이싱은 시리즈 객체의 인덱스가 어떻게 지정되었는가에 따라 넘파이 1차원 어레이와 동일한 방식과 동일하거나 동일하지 않은 두 가지 방식으로 지원된다.

15.3.1시리즈 인덱싱

먼저, 시리즈 인덱싱을 설명한다. 설명을 위해 아래 시리즈를 이용한다.

series4 = pd.Series(np.arange(0, 11, 2.5), index=['A', 'B', 'C', 'D', 'E'])
series4
A 0.0 B 2.5 C 5.0 D 7.5 E 10.0 dtype: float64

아래 코드는 지정된 인덱스를 직접 이용하여 인덱스와 동일한 행에 위치한 항목을 확인하는 방식을 보여준다.

series4['B']
np.float64(2.5)

그런데 사용자가 직접 지정한 인덱스와는 별도로 시리즈 객체는 내부에 0, 1, 2 등 행 순서에 맞는 정수 인덱스를 별도로 저장하며, 이 정수 인덱스를 리스트와 1차원 어레이의 인덱싱과 동일하게 작동하도록 할 수 있다. 대신 아래 코드에서처럼 시리즈.iloc[정수인덱스]형식으로 사용되어야 한다. 아래 코드는 B 인덱스 행이 둘째 행이기에 정수 인덱스 1을 이용하여 동일한 항목을 확인해준다.

series4.iloc[1]
np.float64(2.5)

반면에 인덱스 E에 해당하는 인덱싱은 다음 세 가지 방식으로 가능하다. -1은 마지막 인덱스를 가리킴에 주의한다.

series4['E']
np.float64(10.0)
series4.iloc[4]
np.float64(10.0)
series4.iloc[-1]
np.float64(10.0)

15.3.2시리즈 슬라이싱

행 위치를 나타내는 정수 인덱스로 슬라이싱할 때는 iloc[]를 사용한다. 사용법은 1차원 어레이의 슬라이싱과 사실상 동일하다. 다만 슬라이싱 결과로 다시 시리즈가 생성되며, 인덱스는 슬라이싱 구간에 포함된 인덱스가 그대로 사용된다.

series4.iloc[1:3]
B 2.5 C 5.0 dtype: float64

반면에 정수가 아닌 주어진 인덱스를 이용하는 슬라이싱은 리스트의 슬라이싱과 비슷하지만, 지정된 구간의 양쪽 끝을 모두 포함한다는 점이 다르다.

예를 들어 아래 코드는 3번 인덱스의 행이 D 인덱스 행에 해당하지만 그 행까지 포함하여 슬라이싱이 적용된다.

series4['B':'D']
B 2.5 C 5.0 D 7.5 dtype: float64

15.3.3항목 대체

인덱싱과 슬라이싱을 이용하여 지정된 구간의 항목을 한꺼번에 변경할 수 있다.

인덱싱 활용

지정된 인덱스 위치의 항목을 다른 값으로 대체한다.

series4 = pd.Series(np.arange(0, 11, 2.5), index=['A', 'B', 'C', 'D', 'E'])
series4['B'] = -5.0
series4
A 0.0 B -5.0 C 5.0 D 7.5 E 10.0 dtype: float64
series4 = pd.Series(np.arange(0, 11, 2.5), index=['A', 'B', 'C', 'D', 'E'])
series4.iloc[0] = -2.5
series4
A -2.5 B 2.5 C 5.0 D 7.5 E 10.0 dtype: float64

슬라이싱 활용

항목 변경에 사용되는 값은 스칼라, 즉 정수, 부동소수점, 불리언 등의 단일 값이거나, 슬라이싱 구간의 크기와 동일한 리스트, 튜플, 1차원 어레이 등으로 지정된다. 변경값으로 스칼라를 사용하면 지정된 구간의 모든 항목이 지정된 스칼라로 지정되며, 리스트 등이 지정되면 순서에 맞게 항목이 지정된다.

series4 = pd.Series(np.arange(0, 11, 2.5), index=['A', 'B', 'C', 'D', 'E'])
series4.iloc[1:3] = 7.2
series4
A 0.0 B 7.2 C 7.2 D 7.5 E 10.0 dtype: float64
series4 = pd.Series(np.arange(0, 11, 2.5), index=['A', 'B', 'C', 'D', 'E'])
series4['B':'C'] = 5.0
series4
A 0.0 B 5.0 C 5.0 D 7.5 E 10.0 dtype: float64
series4 = pd.Series(np.arange(0, 11, 2.5), index=['A', 'B', 'C', 'D', 'E'])
series4.iloc[1:3] = [1.5, 2.0]
series4
A 0.0 B 1.5 C 2.0 D 7.5 E 10.0 dtype: float64
series4 = pd.Series(np.arange(0, 11, 2.5), index=['A', 'B', 'C', 'D', 'E'])
series4['B':'C'] = np.array([7.2, 5.0])
series4
A 0.0 B 7.2 C 5.0 D 7.5 E 10.0 dtype: float64

15.3.4연습문제

(1)