[Pandas] 시리즈(Series) 기본 문법 정리

민정·2023년 2월 11일
1

데이터공부

목록 보기
5/9
post-custom-banner

판다스의 시리즈는 일차원 데이터를 관리하는 자료구조로, 데이터와 함께 인덱스를 사용하여 데이터에 레이블을 달아둘 수 있다. 리스트와 튜플의 장점을 섞어 놓은 것과 같이 동작한다.

설치

!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 메서드를 사용한다

◻️ 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

참고

' 금융 데이터 분석을 위한 파이썬 판다스' 책을 참고하여 작성되었습니다.

profile
공부 기록장
post-custom-banner

0개의 댓글