판다스의 시리즈는 일차원 데이터를 관리하는 자료구조로, 데이터와 함께 인덱스를 사용하여 데이터에 레이블을 달아둘 수 있다. 리스트와 튜플의 장점을 섞어 놓은 것과 같이 동작한다.
!pip install pandas
from pandas import Series
data = [10,20,30]
s = Series(data)
print(s)
0 10 1 20 2 30 dtype: int64
→ 파이썬 리스트를 활용하여 시리즈 객체를 생성할 수 있다. 따로 인덱스를 지정해주지 않으면 자동으로 정수 인덱스가 생성된다 !
import numpy as np
data = np.arange(5)
s = Series(data)
print(s)
0 0
1 1
2 2
3 3
4 4
dtype: int64
→ 넘파이를 사용해서 시리즈를 생성할 수도 있다. 문자열 데이터도 저장가능하다.
🔶 문자열과 정수형 타입을 하나의 시리즈로 만들면 전체 데이터가 object 타입으로 관리된다. 하지만 object 타입은 브로드캐스팅 기능을 활용할 수 없으니 되도록 같은 데이터 타입을 저장하는 것이 좋다.
파이썬의 딕셔너리와 비슷하게 시리즈도 각 데이터에 인덱스를 설정할 수 있다.
data = [100,200,300]
s = Series(data)
print(s.index)
print(s.index.to_list())
s.index = ["메로나","구구콘","투게더"]
print(s.index)
RangeIndex(start=0, stop=3, step=1)
[0, 1, 2]
Index(['메로나', '구구콘', '투게더'], dtype='object')
→ to_list() 함수를 사용하여 인덱스를 리스트 형태로 받아올 수 있다.
시리즈 객체 생성 후에 인덱스 수정도 가능하다. s.index 를 활용하여 인덱스의 값을 변경할 수 있다.
◻️ 시리즈 객체 생성 시 인덱스 지정
price = [42500,42550,41800,42550,42650]
date = ["2023-02-09","20123-02-10","2023-02-11","2023-02-12","2023-02-13"]
s = Series(price,date)
print(s)
2023-02-09 42500
20123-02-10 42550
2023-02-11 41800
2023-02-12 42550
2023-02-13 42650
dtype: int64
→ 인덱스를 배열에 담아 같이 지정해줄 수 있다.
◻️ reindex 메서드 사용
data = [100,200,300]
index = ['메로나','구구콘','하겐다즈']
s = Series(data,index)
s2 = s.reindex(['메로나','비비빅','구구콘'])
print(s2)
메로나 100.0
비비빅 NaN
구구콘 200.0
dtype: float64
→ reindex 메서드를 사용하면 전달한 값으로 인덱스를 변경, 기존에 있던 인덱스는 그대로 사용. 새로운 인덱스에는 NaN 값을 채운다.
◻️ 딕셔너리를 활용하여 시리즈 생성
date = {
"2023-02-09":42500,
"2023-02-10":42550,
"2023-02-11":41800,
"2023-02-12":42550,
"2023-02-13":42650,
}
s = Series(date)
→ 파이썬 딕셔너리 객체를 활용하여 시리즈 생성, index에는 딕셔너리의 key 값이 들어간다.
시리즈 객체는 생성될 때 인덱스 이외에도 행 번호가 자동으로 부여된다. 눈에 보이지 않지만 내부적으로 부여되는 번호이다. 따라서 시리즈 객체에서는 행 번호와, 인덱스 두가지로 접근이 가능하다. 행 번호를 사용해서 인덱싱할 때 iloc, 인덱스를 사용할 때 loc 을 사용한다.
◻️ iloc을 사용한 인덱싱
from pandas import Series
data = [100,200,300]
s = Series(data = data)
print(s.iloc[0])
print(s.iloc[1])
100
200
→ 인덱스에 해당하는 값이 출력된다.
◻️ loc 을 사용한 인덱싱
data = [100,200,300]
index = ["메로나","구구콘","하겐다즈"]
s = Series(data,index)
print(s.iloc[0])
print(s.loc['메로나'])
→ iloc 을 활용하여 행 번호로 불러올 수 있다. loc 을 활용하여 지정한 인덱스로 불러올 수 있다.
🔶 iloc과 loc 두 가지 다 사용하는 이유
해당 인덱스를 모르더라도 행 번호를 사용해서 iloc 으로 쉽게 불러올 수 있다. 또한 본인이 지정한 인덱스로 불러오고자 할 때 loc 을 활용하여 편하게 불러올 수 있다
◻️ 시리즈 iloc, loc 연산 슬라이싱
시리즈 객체에서도 연속된 값을 슬라이싱 할 수 있다. 이때도 iloc, loc 을 활용하여 슬라이싱을 한다. iloc[시작 행 번호: 끝 행 번호]
data = [100,200,300]
index = ["메로나","구구콘","하겐다즈"]
s = Series(data = data, index = index)
print(s.iloc[0:2])
메로나 100
구구콘 200
dtype: int64
data = [100,200,300]
index = ["메로나","구구콘","하겐다즈"]
s = Series(data = data, index = index)
print(s.loc["구구콘":"하겐다즈"])
구구콘 200
하겐다즈 300
dtype: int64
◻️ 연속적이지 않은 값들에 대한 슬라이싱
시리즈 객체는 리스트와 달리 연속적이지 않은 값들에 대해서도 슬라이싱 할 수 있다. 데이터 행 번호나 인덱스를 리스트로 표현 후 iloc,loc 을 활용한다.
data = [100,200,300]
index = ["메로나","구구콘","하겐다즈"]
s = Series(data = data, index = index)
indice = [0,2]
print(s.iloc[indice])
메로나 100
하겐다즈 300
dtype: int64
→ indice 로 행번호 0, 2를 지정하여 해당되는 번호의 객체들만 print 해주었다.
loc, iloc 을 활용하여 특정 위치에 접근한 뒤 변경할 값을 넣어주면 된다. 파이썬의 딕셔너리와 유사한 형태이다.
◻️ 시리즈 수정
data = [100,200,300]
index = ["메로나","구구콘","하겐다즈"]
s = Series(data = data, index = index)
s.loc['메로나'] = 600
print(s)
메로나 600
구구콘 200
하겐다즈 300
dtype: int64
◻️ 시리즈 추가
data = [100,200,300]
index = ["메로나","구구콘","하겐다즈"]
s = Series(data = data, index = index)
s.loc['비비빅'] = 700
print(s)
메로나 600
구구콘 200
하겐다즈 300
비비빅 700
dtype: int64
◻️ 시리즈 삭제
data = [100,200,300]
index = ["메로나","구구콘","하겐다즈"]
s = Series(data = data, index = index)
s.drop('메로나')
print(s)
구구콘 200
하겐다즈 300
dtype: int64
넘파이와 동일하게 브로드캐스팅이 적용된다. 같은 인덱스를 가지는 데이터끼리의 연산이 가능하다.
◻️ 시리즈 연산
person1 = Series([10,20,30],['Naver','KT','SKT'])
person2 = Series([30,40,60],['KT','SKT','Naver'])
family = person1+person2
print(family)
KT 50
Naver 70
SKT 70
dtype: int64
◻️ idxmax | idxmin
반복문을 사용할 필요 없이 최솟값,최댓값인 인덱스를 반환할 수 있다.
print(family.idxmax())
print(family.idxmin())
◻️ unique
data = {
"삼성전자":"전기,전자",
"LG전자":"전기,전자",
"현대차":"운수장비",
"네이버":"서비스업",
"카카오":"서비스업"
}
s = Series(data)
print(s.unique())
['전기,전자' '운수장비' '서비스업']
→ 중복을 제거하고 가져오고 싶을 때 unique 메서드를 사용한다.
◻️ value_counts()
s.value_counts()
전기,전자 2
서비스업 2
운수장비 1
dtype: int64
→ 시리즈 안에 몇번 중복되어 나타나는지 횟수를 세고자 할 때 사용
시리즈는 파이썬 처럼 바로 적용되지 않는 경우도 있다. 이런 경우에 map 메서드를 사용한다
◻️ map()
def remove_comma(x):
return int(x.replace(",",""))
s = Series(["2,344","4,567","1,9874"])
result = s.map(remove_comma)
print(result)
0 2344
1 4567
2 19874
dtype: int64
→ 콤마를 공백으로 바꿔주는 함수를 작성하고 map을 적용하여 준다.
◻️ map() 을 활용한 수치형 → 범주형
def greater_than(x):
if x>5000:
return "크다"
else:
return "작다"
result2 = result.map(greater_than)
print(result2)
0 작다
1 작다
2 크다
dtype: object
비교 연산을 활용하여 시리즈 필터링을 할 수 있다
◻️ 시리즈 필터링
data = [42500,45000,41800,42650]
index = ['2023-02-09','2023-02-10','2023-02-11','2023-02-12']
s = Series(data,index)
cond = s>43000
print(cond)
2023-02-09 False
2023-02-10 True
2023-02-11 False
2023-02-12 False
dtype: bool
→ 비교연산을 활용하여 결과값을 출력
print(s[cond])
2023-02-10 45000
→ True 인 값만 출력
sort_values 의 자체 정렬 메서드를 가진다. 메서드를 호출하면 데이터를 기준으로 오름차순 정렬이 된다.
◻️ sort_values()
s.sort_values()
2023-02-11 41800
2023-02-09 42500
2023-02-12 42650
2023-02-10 45000
dtype: int64
시리즈 객체는 순위를 매기기 위한 rank 메서드를 제공한다. 기본적으로 값이 작은 데이터를 1순위로 지정한다.
◻️ rank()
s.rank()
2023-02-09 2.0
2023-02-10 4.0
2023-02-11 1.0
2023-02-12 3.0
dtype: float64
참고
' 금융 데이터 분석을 위한 파이썬 판다스' 책을 참고하여 작성되었습니다.