pandas-series
pandas Series 객체

pandas는 데이터를 조작하고 분석하는 데 사용하는 파이썬(Python)의 라이브러리입니다. 엑셀(excel)과 같은 데이터 분석 도구가 있는데 왜 pandas를 사용하면 좋을까요? pandas는 엑셀로 처리하기에는 데이터양이 많을 때 사용하기에 좋습니다. 엑셀에서 많은 양의 데이터를 처리하면 프로그램 속도가 지연되는 문제가 발생합니다. 하지만 pandas에서는 속도가 느려지는 문제 없이 데이터를 처리할 수 있습니다. 그래서 Pandas는 엑셀과 더불어 데이터 분석 시 활용할 수 있는 좋은 도구입니다.

파이썬 pandas에는 세 가지 자료 구조(data structure)가 있습니다. 바로 시리즈(Series), 데이터 프레임(DataFrame), 그리고 패널(Panel)입니다. 간단히 말해 Series는 1차원 데이터 자료 구조, DataFrame은 2차원, Panel은 3차원 데이터 자료 구조입니다. 이번 시간에는 Series를 사용하는 법을 알아보겠습니다. 글을 시작하기 전에 몇 가지 안내 사항을 말씀드리겠습니다.

안내 사항

첫 번째는 pandas를 임포트(import)하는 방식입니다. 보통 pandas 패키지를 임포트 할 때 pandas를 pd라고 표기합니다. 여기에서도 관례를 따라 import pandas as pd를 사용하겠습니다. 모든 코드 예제에는 pandas를 pd로 임포트했다는 것을 가정합니다.

두 번째는 결과를 확인하는 법입니다. 주피터 노트북(Jupyter Notebook)을 사용하시는 경우 해당 코드를 실행하시고 만들어진 변수를 한 번 더 입력하셔야 결과를 보실 수 있습니다. 예를 들어 object라는 변수를 만드셨다면 object를 한 번 더 입력하셔야 결괏값이 출력됩니다. 텍스트 에디터나 IDE를 사용하시는 분들은 print() 함수를 사용하시면 됩니다.

세 번째는 글의 목차입니다. 목차는 CRUD 개념을 바탕으로 만들어졌습니다. CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(고침), Delete(삭제)를 묶어서 일컫는 말입니다. 여기서도 이 개념을 따라서 데이터 분석 실습을 하겠습니다.

마지막으로 내용입니다. Series 편은 다음 글에서 다룰 DataFrame 편과 Panel 편보다 간략합니다. Series에서 사용하는 함수 대부분은 DataFrame과 Panel에서 사용할 수 있습니다. 여기에서는 pandas에서 사용하는 함수를 전체적으로 훑어본다고 생각하시면 좋겠습니다. 그럼 pandas 사용법 Series편을 시작해보겠습니다.

먼저 Series의 정의를 알아보겠습니다. Series란 무엇일까요?

Series 정의

Series는 1차원 배열과 같은 자료구조입니다. Series 객체는 파이썬의 딕셔너리(dictionary)와도 비슷합니다. Series에서의 인덱스 - 값 관계가 딕셔너리의 키-값 관계와 서로 대응되죠. Series는 열이 1개인 데이터 프레임(DataFrame)이라고도 볼 수 있습니다.

pandas-series-dataframe-difference
Series 와 DataFrame 차이 | Snug Archive

벡터(vector) 관점에서 보면 Series는 1차원 벡터 데이터(A = [1, 5, 3, 4])에 행 인덱스(row index)를 붙인 것이기도 합니다.

벡터(vector)
크기와 방향을 모두 가지는 어떤 양

그럼 Series 객체는 어떻게 만들까요?

데이터 생성

Series 객체를 만드는 방법에는 크게 3가지가 있습니다. 첫 번째는 리스트로 만드는 것, 두 번째는 딕셔너리로 만드는 것, 세 번째는 튜플로 만드는 것입니다.

1) 리스트로 만들기

리스트로 Series를 만드는 방법은 다시 두 가지 방식으로 나눌 수 있습니다. 하나는 색인(index)을 지정하지 않고 만드는 것이고 다른 하나는 색인을 지정해서 만드는 것입니다.

색인이란 데이터의 주소(address)와도 같은 것입니다. 각 값에는 데이터의 주소가 있고 우리는 이 주소를 가지고 데이터에 접근할 수 있죠.

색인 지정하지 않고 만들기

첫 번째 방법은 색인을 따로 지정하지 않고 리스트로 Series 객체를 만드는 방법입니다. 이 방법으로 Series 객체를 만들려면 pd.Series() 클래스에 원하는 리스트를 인자(argument)로 주면 됩니다.

python
object1 = pd.Series([100, 50, 70, 90])
# 결과
0 100
1 50
2 70
3 90
dtype: int64
objectEtc = pd.Series(range(5, 11)) # 5부터 10까지 Series 만들기
# 결과
0 5
1 6
2 7
3 8
4 9
5 10
dtype: int64

위 코드의 결과를 보시면 Series 객체가 잘 만들어진 것을 확인할 수 있습니다. 여기서 질문 하나. 우리가 만든 Series 객체에는 색인이 없는 것일까요? 아까 색인을 지정하지 않고 만든다고 했으니까요? 아닙니다. 색인은 Series 객체를 만들 때 기본적으로 만들어집니다. 바로 코드 결과 왼쪽 편에 있는 정수(integer)가 바로 색인입니다.

우리는 이 정수 색인으로 데이터에 접근할 수 있습니다. 색인을 지정한다는 말은 객체를 만들 때 기본적으로 주어진 이 정수 색인 말고, 원하는 색인을 우리가 직접 정해서 사용하겠다는 의미입니다. 그럼 색인을 직접 지정해서 Series를 만들어볼까요?

색인 지정해서 만들기

색인을 지정해서 Series 객체를 만드는 것에는 크게 4가지 방법이 있습니다.

pd.Series 클래스의 index 매개변수에 직접 리스트 인자를 할당
python
object2 = pd.Series([100, 50, 70, 90], index=['국어', '수학', '영어', '과학'])
# 결과
국어 100
수학 50
영어 70
과학 90
dtype: int64

이 코드를 통해 색인 객체는 Index([0, 1, 2, 3], dtype='object')에서 Index(['국어', '수학', '영어', '과학'], dtype='object')로 바뀐 것을 알 수 있습니다.

pd.Series 클래스의 index 매개변수에 변수 할당

index 매개변수에 변수를 할당하는 방법도 있습니다. 아래 코드에서와 같이 말이죠.

python
subjects = ['국어', '수학', '영어', '과학']
object2 = pd.Series([100, 50, 70, 90], index=subjects)
# 결과
국어 100
수학 50
영어 70
과학 90
dtype: int64
pd.Series 클래스의 data와 index 매개변수에 변수 할당

이번에는 index 뿐 아니라 data도 변수로 전달해보겠습니다. 코드가 조금 더 정리된 느낌이 납니다.

python
data = [100, 50, 70, 90]
subjects = ['국어', '수학', '영어', '과학']
object2 = pd.Series(data=data, index=subjects)
# 결과
국어 100
수학 50
영어 70
과학 90
dtype: int64
Series 객체를 만든 후 index 속성으로 색인을 지정

마지막으로 Series 객체를 만든 다음에 index 속성으로 색인을 지정하는 방법입니다.

python
object1.index = ['국어', '수학', '영어', '과학']
# 결과
국어 100
수학 50
영어 70
과학 90
dtype: int64

만약 새로운 색인을 지정하고 싶다면 index 속성에 새 리스트를 전달하면 됩니다. 예를 들어 Index(['사과', '당근', '셀러리', '토마토'], dtype='object')라는 색인을 사용하고 싶다면 index 속성에 해당 리스트를 할당하는 것이죠.

python
# 기존 색인 ['국어', '수학', '영어', '과학']
object1.index = ['사과', '당근', '셀러리', '토마토']
# 결과
사과 100
당근 50
셀러리 70
토마토 90
dtype: int64

2) 딕셔너리로 만들기

Series를 만드는 두 번째 방법은 딕셔너리를 사용하는 것입니다. 앞서 정의에서 말씀드렸던 것처럼 Series는 길이가 고정되어 있으며 알파벳 순으로 정렬된 사전형과도 비슷합니다. 딕셔너리로 Series를 만들 때 역시 리스트를 만들 때와 마찬가지로 색인 지정 여부에 따라 만드는 법이 달라집니다.

색인 지정하지 않고 만들기

사전 객체로 Series 객체를 만들려면 키-값 쌍으로 이루어진 딕셔너리를 pd.Series 클래스에 인자로 전달하면 됩니다. 예제 코드는 다음과 같습니다.

python
score_data = {'국어': 100, '수학': 50, '영어': 70, '과학': 90}
object3 = pd.Series(score_data)
# 결과
국어 100
수학 50
영어 70
과학 90
dtype: int64

색인 지정해서 만들기

이번에는 딕셔너리 데이터와 색인을 함께 전달해서 Series 객체를 만들어 보겠습니다. 이 경우, 딕셔너리에 새 키를 넣으면 기존에 있던 키-값 쌍은 그대로 가져오고, 새로운 키에 해당하는 값은 NaN으로 표시됩니다. 예제 코드로 살펴보겠습니다.

python
score_data = {'국어': 100, '수학': 50, '영어': 70, '과학': 90}
new_subjects = ['국어', '수학', '영어', '사회']
object4 = pd.Series(score_data, index=new_subjects)
# 결과
국어 100.0
수학 50.0
영어 70.0
사회 NaN
dtype: float64

여기서 색인 '과학'과 '과학' 색인에 해당하는 값은 사라졌습니다. 그리고 새로운 색인인 '사회'가 나타났습니다. '사회' 색인 값에 매핑(mapping)되었던 데이터 값은 Not a Number를 뜻하는 NaN 입니다. 데이터가 담긴 딕셔너리에 키가 없었기 때문에 가져올 값도 없었던 것이죠.

3) 튜플로 만들기

Series 객체를 만드는 마지막 방법은 튜플을 사용하는 것입니다. 튜플로 Series 객체를 만드는 방식은 리스트로 Series를 만드는 방식과 동일합니다.

python
data = ([100, 50, 70, 90])
objectTuples = pd.Series(data=data, index=['국어', '수학', '영어', '과학'])
# 결과
국어 100
수학 50
영어 70
과학 90
dtype: int64

지금까지 Series를 만드는 3가지 방법(리스트, 딕셔너리, 튜플 사용)을 살펴보았습니다. 이번에는 생성한 데이터 정보에 이름을 붙이거나 통합 색인 이름을 만들어 데이터 정보를 생성하는 법을 알아보겠습니다.

데이터 정보 생성

우리가 만든 Series 객체 이름과 색인을 아우르는 통합 색인 이름을 부여하려면 각각 name 속성과 index.name 속성을 사용하면 됩니다. 아래 코드에서처럼 데이터명으로는 '교과 점수'가 통합 색인 이름으로는 '과목명'이 새롭게 나타난 것을 확인할 수 있습니다.

python
object3.name = '교과 점수' # 데이터에 이름 부여
object3.index.name = '과목명' # 통합 색인명 부여
object3
# 결과
과목명
국어 100
수학 50
영어 70
과학 90
Name: 교과 점수, dtype: int64

지금까지 우리는 Series 객체를 생성하는 법을 알아보았습니다. 데이터를 만들지 않고 가져올 수도 있는데요, 데이터를 가져오는 법은 다음 DataFrame 편에서 다루겠습니다. 데이터가 준비되었으면 다음에 할 작업은 데이터를 확인하는 일입니다. 일단 데이터가 전체적으로 어떻게 생겼는지 알아야 데이터를 가공해 더 정확한 결과를 도출할 수 있겠죠.

데이터를 확인할 때는 2가지 관점에서 접근합니다. 하나는 데이터의 개요를 파악하는 것, 그리고 다른 하나는 데이터의 결측치를 확인하는 것입니다. 데이터의 개요를 파악하는 것은 데이터에 대한 전체적인 그림을 그리기 위해서입니다. 앞으로 어떻게 데이터를 처리해야 할지 감을 잡는 일이죠.

데이터의 결측치를 파악하는 일은 특히 더 중요합니다. 결측치 처리 여부에 따라 최종 결괏값에 영향을 줄 수 있기 때문입니다. 이번 편에서는 색인을 확인하는 법과 데이터 결측치를 파악하는 법만 간략히 소개하겠습니다.

데이터 확인

1) 개요

색인

색인은 index 속성으로 선택할 수 있습니다.

python
object2.index # object2의 색인 가져오기
# 결과
Index(['국어', '수학', '영어', '과학'], dtype='object')
특정 Series 객체에 해당 색인이 있는지 확인하려면 원하는 색인 라벨(label)을 넣으면 됩니다.
```python
'감자' in object2 # object2에 '감자'라는 색인이 있는지 확인
# 결과
False

전체 값

전체 값은 values 속성으로 가져올 수 있습니다.

python
object2.values
# 결과
array([100, 50, 70, 90], dtype=int64)

2) 결측치

Series에서 누락된 데이터를 찾을 때는 isnull 함수나 notnull 함수를 사용하면 됩니다.

python
pd.isnull(object4) # 누락된 데이터가 있는가?
# 결과
국어 False
수학 False
영어 False
사회 True
dtype: bool
pd.notnull(object4) # 누락된 데이터가 없는가?
# 결과
국어 True
수학 True
영어 True
사회 False
dtype: bool

이 메서드는 아래 코드에서와 같이 Series의 인스턴스 메서드(methods)로도 사용할 수 있습니다.

python
object4.isnull() # 누락된 데이터가 있는가?
# 결과
국어 False
수학 False
영어 False
사회 True
dtype: bool
object4.notnull() # 누락된 데이터가 없는가?
# 결과
국어 True
수학 True
영어 True
사회 False
dtype: bool

지금까지 데이터를 생성하고 확인하는 법을 알아보았습니다. 그럼 이제 데이터에 접근할 수 있어야겠죠. 데이터에 접근하는 것은 데이터를 선택하는 일이기도 합니다. 여기서 특정 위치나 1개 색인 값에 매핑된 특정 값 1개를 선택하는 것을 인덱싱(indexing), 여러 개의 색인에 따라 다수의 원소로 이루어진 부분 집합을 가져오는 것을 슬라이싱(slicing) 이라고 합니다.

데이터 선택(기본)

데이터를 선택하는 기본 방법으로는 특정 값 선택하기와 여러 색인에 해당하는 값 선택하기가 있습니다. 하나씩 살펴보도록 하죠.

1) 특정 값 1개 선택하기

특정 값을 선택하려면 색인을 사용하면 됩니다. 인덱싱할 때 정수 색인을 사용할 수도 있고 라벨 색인을 사용할 수도 있죠.

python
object1[1] # 정수 색인 사용해 Series 두 번째 원소에 접근하기
# 결과
50
object2['수학'] # 라벨 색인 사용해 Series '수학' 색인 값에 매핑된 데이터 값 가져오기
# 결과
50

2) 여러 색인에 해당하는 값 선택하기

특정 값이 아니라 여러 색인 값에 각각 맵핑된 값을 선택하려면 아래 코드에서처럼 정수 색인 리스트 또는 색인의 범위를 전달할 수 있습니다.

python
# object1 = pd.Series([100, 50, 70, 90])
object1[[0, 1, 2]] # 자료 순서 그대로 출력
# 결과
국어 100
수학 50
영어 70
dtype: int64
object1[[2, 0, 1]] # 자료 순서 바꿔서 출력
# 결과
영어 70
국어 100
수학 50
dtype: int64
object1[0:3] # 정수 색인 범위 전달
# 결과
국어 100
수학 50
영어 70
dtype: int64

색인을 지정했으면 색인 라벨로도 데이터를 선택할 수 있습니다.

python
object2[["국어", "수학"]]
# 결과
국어 100
수학 50
dtype: int64
object2["국어": "영어"]
# 결과
국어 100
수학 50
영어 70
dtype: int64

지금까지 인덱싱과 슬라이싱을 통해 데이터를 선택하는 법을 알아보았습니다. 만약 색인과 값을 모두 선택하려면 아래 파이썬의 함수를 사용해도 됩니다. 여기에서는 items() 함수를 사용해보았습니다.

python
for key, value in object2.items():
print(f"{key} 점수: {value}")
# 결과
국어 점수: 100
수학 점수: 50
영어 점수: 70
과학 점수: 90

지금까지 데이터를 선택하는 기본 방법을 알아보았는데요, 목적에 따라 데이터를 선택하는 방법도 있습니다.

데이터 선택(목적별)

1) 라벨 색인로 데이터 선택: .loc 속성 사용

.loc 속성에 라벨 색인을 넣으면 해당 색인에 매핑된 값을 찾을 수 있습니다.

python
object2.loc['수학'] # '수학'이라는 라벨 색인에 맵핑된 값 찾기
# 결과
50

2) 정수 색인으로 데이터 선택: .iloc 속성 사용

.iloc 속성은 정수 색인으로 데이터를 선택하는 방법입니다. .iloc 속성에 원하는 정수 색인을 넣으면 해당 인덱스와 연결된 값을 선택할 수 있습니다.

python
object2.iloc[1]
# 결과
50

3) 조건으로 데이터 선택

Series 객체에서는 특정 조건에 따라 원하는 데이터를 추출할 수 있습니다. 다음 코드로는 우리가 만든 Series 객체에서 75를 넘는 데이터 결과만 가져올 수 있습니다.

python
object2[object2 > 75]
# 결과
국어 100
과학 90
dtype: int64

조건을 두 가지 이상으로 줄 수도 있죠. 아래 코드는 object2 Series 객체에서 65점 초과 90점 미만인 결과를 반환합니다.

python
object2[(object2 > 65) & (object2 < 90)]
# 결과
영어 70
dtype: int64

지금까지 데이터를 선택하는 기본 방법과 목적별로 사용할 수 있는 방법을 알아보았습니다. 다음으로는 데이터를 추가, 수정, 삭제하는 법을 알아보겠습니다.

데이터 추가, 수정, 삭제

1) 추가

데이터를 추가하려면 새로운 색인과 값을 만들면 됩니다. 아래 코드는 Series 객체에 색인으로는 '음악' 과목을 값으로는 80을 추가하는 예제입니다.

python
# object2 = pd.Series([100, 50, 70, 90], index=['국어', '수학', '영어', '과학'])
object2['음악'] = 80
# 결과
국어 100
수학 50
영어 70
과학 90
음악 80 # 음악 과목 추가됨
dtype: int64

2) 변경/수정/갱신

데이터를 수정하려면 기존의 색인명에 새 값을 부여하면 됩니다. 그럼 기존의 값이 새 값으로 갱신됩니다.

python
object2['수학'] = 100 또는 object2.loc['수학'] = 100
# 결과
국어 100
수학 100 # 50점에서 100으로 변경됨
영어 70
과학 90
dtype: int64

3) 삭제: del

데이터를 삭제하려면 del을 사용하면 됩니다.

python
del object2['국어']
# 결과
수학 100
영어 70
과학 90
dtype: int64

데이터 연산

산술 연산(arithmetic operation)

Series에서는 아주 간단하게 모든 값에 동시에 연산을 수행할 수 있습니다. 다음은 Series 객체의 모든 값을 2로 나누는 연산입니다.

python
object2 / 2
# 결과
국어 50.0 # 100에서 50
수학 25.0 # 50에서 25
영어 35.0 # 70에서 35
과학 45.0 # 90에서 45
dtype: float64

Series 객체와 Series 객체끼리의 연산도 가능합니다. 산술 연산 시에는 Series가 색인과 라벨로 자동 정렬됩니다.

python
object3 + object4
# 결과
과학 NaN
국어 200.0
사회 NaN
수학 100.0
영어 140.0
dtype: float64
object3.values + object4.values
# 결과
array([200., 100., 140., nan])

지금까지 데이터를 생성하는 법, 데이터에 대한 정보를 생성하는 법(데이터 이름 및 통합 색인 이름 지정), 데이터를 확인하는 방법, 데이터를 선택하는 기본 방법과 목적별로 선택하는 방법, 데이터를 추가, 수정, 삭제하는 법, 마지막으로 데이터의 연산을 살펴보았습니다.

다음 시간에는 DataFrame을 사용하는 법을 알아보겠습니다. DataFrame 사용법은 총 네 부분으로 나뉩니다.

파이썬 pandas의 Series 객체와 관련해 더 많은 내용은 pandas 공식 홈페이지 Series에서 확인하실 수 있습니다. 모두 수고 많으셨습니다.

참고 문헌

...

©2022 Snug Archive. All rights reserved.

Contact me at snugarchive@gmail.com.