AI/Pandas

01. 자료구조 - 시리즈

Python version : 3.7.10

Pandas version : 1.1.5

시리즈의 구조

시리즈는 데이터가 순차적으로 나열된 1차원 배열의 형태를 갖습니다. index와 value로 일대일 대응 됩니다. '{k:v}' 형태로 짝을 이루는 파이썬의 딕셔너리와 비슷한 구조를 갖습니다.

시리즈 만들기

1. 딕셔너리 이용하기

딕셔너리와 시리즈의 구조가 비슷하기 때문에 딕셔너리를 시리즈로 변환하는 방법을 많이 사용합니다. 아래와 같은 방법으로 딕셔너리를 시리즈 객체로 바꿀 수 있습니다.

import pandas as pd 

dict_data = {"ab" : "1", "bc" : 2, "cd" : 3}
sr_dict = pd.Series(dict_data)

print(dict_data)
print(type(sr_dict))
print('\n')
print(sr_dict)

딕셔너리의 key는 시리즈의 index

딕셔너리의 value은 시리즈의 value

에 대응됩니다.

Series() 함수에 전달하면 시리즈 객체로 리턴되어 sr_dict에 저장됩니다.

print(dict_data)의 출력 결과는 {'ab': '1', 'bc': 2, 'cd': 3}가 되는 것을 통해 원본 데이터가 훼손되지 않는 것을 알 수 있습니다.

print(type(sr_dict))의 출력 결과 <class 'pandas.core.series.Series'>를 통해 변경된 객체의 자료형을 보면 시리즈 클래스임을 알 수 있습니다.

print(sr_dict)sr_dict를 출력하면

ab  1
bc  2 
cd  3

이렇게 왼쪽에는 index가, 오른쪽에는 value가 표시됩니다.

idx = sr_dict.index
val = sr_dict.values

이 코드를 사용하면 idxval에 각각 sr_dict의 index와 value 배열을 따로 생성할 수 있습니다.
print(idx)의 출력 결과는 Index(['ab', 'bc', 'cd'], dtype='object')임을 통해 배열이 생성되는 것을 확인할 수 있습니다.

2. 리스트 이용하기

시리즈를 만들 때 리스트를 활용할 수 있습니다.

list_data = ['초콜릿', '치킨', 521, " "]
sr_list = pd.Series(list_data)

print(sr_list)
print(type(sr_list))
print('\n')
print(sr_list)

리스트의 index는 시리즈의 index

리스트의 value은 시리즈의 value
에 매칭됩니다.

딕셔너리를 시리즈로 변환했을 때와 비슷하게
print(type(sr_list))의 결과는 <class 'pandas.core.series.Series'>,
print(sr_list)를 통해 리스트를 사용할 때도 리스트 원본이 변하지 않는 것을 알 수 있습니다.

print(sr_list)의 결과로는

0    초콜릿
1     치킨
2    521
3       
dtype: object

마찬가지로 왼쪽에 index, 오른쪽에 value가 위치합니다.

dtype은 시리즈의 value가 전부 숫자라면 int64, 그렇지 않으면 object(문자열)가 됩니다.

3. 튜플 이용하기

튜플 데이터를 시리즈로 만들 수 있습니다.

tup_data = ('jy', '2021-04-18', 22, True) 
#tuple은 리스트와 비슷하지만 수정, 삭제가 불가능하다.
sr_tup = pd.Series(tup_data, index=['이름', '날짜', '나이', '학생여부']) 
#index=[]를 이용하여 Series의 index를 지정할 수 있다. len(index) != len(tup_data) 이면 에러가 발생

튜플은 리스트와 비슷하지만 수정, 삭제가 불가능 합니다.
정수와 변수 사이의 차이와 비슷하다고 볼 수 있습니다.

어떤 데이터를 시리즈 객체로 만들 때 index를 이름으로 지정해주는 경우 index list의 길이와 행 길이가 같아야합니다.

원소 선택

시리즈 객체의 원소를 선택하는 방법에 대해 알아봅시다.
단일 원소 선택과 복수 원소 선택을 하는 방법이 다르기 때문에 주의해야합니다.

tup_data = ('jy', '2021-04-18', 22, True) 
sr_tup = pd.Series(tup_data, index=['이름', '날짜', '나이', '학생여부']) 

print(sr_tup[0])
print(sr_tup['이름'])

print(sr_dict[0])에서처럼 '0'이라는 정수형 위치 인덱스로 선택하거나 print(sr_dict['이름']에서 '이름'이라는 인덱스 이름으로 선택할 수 있습니다.

단일 원소 선택을 할 경우 시리즈의 index 값에 맞는 value 값만 반환합니다.

print(sr_tup[[0,1]]) 
print(sr_tup[['이름', '날짜']])

print(sr_tup[0:2]) #이 때 0이상 2미만으로 2는 포함되지 x
print(sr_tup['이름' : '나이'])

단일 원소 선택과 마찬가지로 정수형 위치 인덱스, 인덱스 이름 모두 사용가능합니다.
단 []괄호를 두 번 사용해야 합니다. 낯선 방법이라 굉장히 헷갈립니다.
또한 복수 원소 선택을 할 경우 index와 value가 짝으로 다음과 같이 반환합니다.

이름 jy 
날짜 2021-04-18

Reference

도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성했습니다.