본문 바로가기

Python/Data analysis

[Python] Data Analysis - Series

데이터 분석중에 시리즈에 대해서 간략히 정리해 보겠습니다.

참고도서 [금융 데이터 분석을 위한 파이썬 판다스]

 

 

인덱스 추출

 

# 인덱스 추출
data = [1000, 2000, 3000]
s = Series(data)
print(s.index)
print(s.index.to_list())
------------------------------
RangeIndex(start=0, stop=3, step=1)
[0, 1, 2]

 

 

인덱스 변경

 

from pandas import Series
import numpy as np

# 인덱스 변경
data = [1000, 2000, 3000] 
s = Series(data)
print(s.index)
print(s.index.to_list())
print(s)

print()
s.index = ["메로나", "구구콘", "하겐다즈"]
print(s.index)
print(s.index.to_list())
print(s)

print()
s.index = np.array(["메로나A", "구구콘B", "하겐다즈C"])
print(s.index)
print(s.index.to_list())
print(s)

----------------------------------------------------------------

RangeIndex(start=0, stop=3, step=1)
[0, 1, 2]
0    1000
1    2000
2    3000
dtype: int64

Index(['메로나', '구구콘', '하겐다즈'], dtype='object')
['메로나', '구구콘', '하겐다즈']
메로나     1000
구구콘     2000
하겐다즈    3000
dtype: int64

Index(['메로나A', '구구콘B', '하겐다즈C'], dtype='object')
['메로나A', '구구콘B', '하겐다즈C']
메로나A     1000
구구콘B     2000
하겐다즈C    3000
dtype: int64

 

 

시리즈 인스턴스 생성 방법(data=None, index=None, ...)

 

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]

s = Series(data=data, index=index)
print(s)

---------------------------------------

메로나     1000
구구콘     2000
하겐다즈    3000
dtype: int64

 

 

reindex 를 이용한 인덱스 변경 - 기존 인덱스와 같은 이름이면 값을 가져오고 새로운 인덱스는 NaN 으로 값을 채운다.

 

data = [1000, 2000, 3000]
index = ['메로나', '구구콘', '하겐다즈']
s = Series(data=data, index=index)
s2 = s.reindex(["메로나", "비비빅", "구구콘", '하겐다'])
print(s2)

--------------------------------------------------------

메로나    1000.0
비비빅       NaN
구구콘    2000.0
하겐다       NaN
dtype: float64

 

 

여기서 NaN , 결측치를 '0' 으로 채우고 싶다면, fillna 함수를 사용한다.

 

print(s2.fillna(0))

-------------------------

메로나    1000.0
비비빅       0.0
구구콘    2000.0
하겐다       0.0
dtype: float64

 

또는 fill_value 옵션을 이용해서 처리 가능하다.

 

print(s.reindex(["메로나", "비비빅", "구구콘", '하겐다'], fill_value=0))
--------------------------------------------------------------------
메로나    1000
비비빅       0
구구콘    2000
하겐다       0
dtype: int64

 

 

딕셔너리를 이용한 시리즈 데이터 만들기

 

# 리스트를 이용한 시리즈 만들기
price = [42500, 42550, 41800, 42550, 42650]
date = ["2019-05-31", "2019-05-30", "2019-05-29", "2019-05-28", "2019-05-27"]
s = Series(price, date)
print(s)

# 딕셔너리를 이용한 시리즈 만들기
data = {
    "2019-05-31" : 42500,
    "2019-05-30" : 42550,
    "2019-05-29" : 41800,
    "2019-05-28" : 42550,
    "2019-05-27" : 42650
}
s = Series(data)
print(s)
--------------------------------------------------------
2019-05-31    42500
2019-05-30    42550
2019-05-29    41800
2019-05-28    42550
2019-05-27    42650
dtype: int64

 

print(s.index)
print(s.index.dtype)
---------------------------------------------
Index(['2019-05-31', '2019-05-30', '2019-05-29', '2019-05-28', '2019-05-27'], dtype='object')
object


print(s.values)
print(s.values.dtype)
---------------------------------------------
[42500 42550 41800 42550 42650]
int64

 

 

인덱싱 - 시리즈 데이터 접근

 

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)

print(s)
print(s.iloc[0])      # 첫데이터 접근
print(s.iloc[-1])     # 마지막 데이터 접근
print(s.loc['메로나'])  # 인덱스 정보로 접근
print(s[0])           # 내부적으로 loc 메서드 호출
-------------------------------------------------------
메로나     1000
구구콘     2000
하겐다즈    3000
dtype: int64
1000
3000
1000
1000

 

 

인덱싱 - 시리즈 데이터 접근시 주의할 점.

 

s1 = Series([10, 20, 30])
s2 = Series([10, 20, 30], index=[1, 2, 3])
print(s1[0])
# print(s2[0])    # 에러, 인덱스를 1부터 설정했기 때문임.

 

 

인덱싱 - 예외 사항) 

 

s3 = Series([10, 20, 30], index=['a', 'b', 'c'])
print(s3[0])      # 인덱스 타입이 정수가 아닌경우, [] 인덱싱은 iloc 처럼 동작함
print(s3['a'])
---------------------------------------------------------------
10
10

 

 

인덱싱 - 그외

 

print(s3.index[0])
print(s3.index[-1])
---------------------------------
a
c

 

 

슬라이싱

 

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)

print(s.iloc[0:2])
print()
print(s.loc['메로나':'구구콘'])
print()
print(s.loc['메로나':'하겐다즈'])
---------------------------------------
메로나    1000
구구콘    2000
dtype: int64

메로나    1000
구구콘    2000
dtype: int64

메로나     1000
구구콘     2000
하겐다즈    3000
dtype: int64

 

 

리스트를 이용한 슬라이싱 - iloc, loc

 

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)

indice = [0, 2]
print(s.iloc[ indice ])
print()
print(s.iloc[ [0, 2] ])
---------------------------------------
메로나     1000
하겐다즈    3000
dtype: int64

메로나     1000
하겐다즈    3000
dtype: int64

 

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)

indice = ["메로나", "하겐다즈"]
print(s.loc[ indice ])
print()
print(s.loc[ ["메로나", "하겐다즈"] ])
-----------------------------------------
메로나     1000
하겐다즈    3000
dtype: int64

메로나     1000
하겐다즈    3000
dtype: int64

 

 

시리즈 수정/추가/삭제

 

수정

 

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)

# 아래 3가지 방법으로 수정 가능함
s.loc['메로나'] = 500        # 값 수정
s.iloc[0] = 500            # iloc 연산 사용
s['메로나'] = 500            # [ ] 기호 사용
print(s)
----------------------------------------
메로나      500
구구콘     2000
하겐다즈    3000
dtype: int64

 

 

추가

 

s.loc['비비빅'] = 500          # 값 추가 
print(s)
----------------------------------------
메로나      500
구구콘     2000
하겐다즈    3000
비비빅      500
dtype: int64

 

 

삭제 - 인덱스로만 삭제 가능, 행번호를 넣어주면 오류 발생함,

그리고 원본 데이터를 직접 수정하는것이 아니고 시리즈 객체를 반환하므로 다른 변수에 바인딩해야 함.

 

s = s.drop('메로나')
print(s)
-------------------------------
구구콘     2000
하겐다즈    3000
비비빅      500
dtype: int64

 

 

시리즈 연산

 

시리즈는 넘파이와 동일하게 브로드캐스팅이 적용되어, 같은 인덱스끼리 연산을 수행한다.

 

철수 = Series([10, 20, 30], index=['NAVER', 'SKT', 'KT'])
영희 = Series([10, 30, 20], index=['SKT', 'KT', 'NAVER'])
가족 = 철수 + 영희
print(가족)
---------------------------------------------------------
KT       60
NAVER    30
SKT      30
dtype: int64

 

 

idxmax - 시리즈의 최대값의 인덱스를 반환한다

idxmin - 시리즈의 최소값의 인덱스를 반환한다

cumprod - 시리즈 누적값을 계산할 수 있다

 

 

data = {
    "삼성전자": "전기,전자",
    "LG전자": "전기,전자",
    "현대차": "운수장비",
    "NAVER": "서비스업",
    "카카오": "서비스업"
}
s = Series(data)
print(s)
print(s.index.to_list())
print(list(s.values))
print(list(s.index))
-------------------------------------
삼성전자     전기,전자
LG전자     전기,전자
현대차       운수장비
NAVER     서비스업
카카오       서비스업
dtype: object
['삼성전자', 'LG전자', '현대차', 'NAVER', '카카오']
['전기,전자', '전기,전자', '운수장비', '서비스업', '서비스업']
['삼성전자', 'LG전자', '현대차', 'NAVER', '카카오']

 

print(s.unique())
print()
print(s.value_counts())
-------------------------------------
['전기,전자' '운수장비' '서비스업']

전기,전자    2
서비스업     2
운수장비     1
dtype: int64