본문 바로가기
🐍Python

[20210803] Pandas 라이브러리 - Series, DataFrame

by 캔 2021. 8. 3.

Pandas란

판다스(Pandas)는 데이터 분석을 위해 사용하는 라이브러리이다. 일차원 데이터를 위한 시리즈(Series)와 이차원 데이터를 위한 데이터프레임(DataFrame) 모듈로 이뤄져 있다. 명령 프롬프트나 터미널에 'pip install pandas'를 입력하여 설치한다.

Pandas.Series

시리즈는 1차원 데이터를 표현하는 자료구조이다. 일차원 구조는 데이터 표 한 행, 한 열, 또는 하나의 데이터만 가지는 구조를 의미한다.

# Pandas.Series
from pandas import Series

data = [1, 2, 3]
print(data)  # data 값에 10을 곱한 값을 구하려면?
print(data * 10)  # [1, 2, 3]에 10을 곱하면, 10, 20, 30이 아니고 1, 2, 3를 10번 반복 출력
s = Series(data)
print(s)  # 인덱스가 자동으로 할당된다.
print(s * 10)  # series에 10을 곱하면, s 값에 10을 곱한 값이 출력된다.

# 딕셔너리처럼 사용
# 인덱스 사용 가능
from pandas import Series

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

from pandas import Series

price = [2000, 25000, 5000, 3000]
fruit = ["banana", "watermelon", "pineapple", "apple"]
s = Series(data=price, index=fruit)
print(s)
print(s.index)  # 딕셔너리 key()와 비슷, index 속성으로 값을 가져올 수 있다.
print(s.values)  # 딕셔너리 values()와 비슷, values 속성으로 값을 가져올 수 있다.

# 시리즈의 인덱싱
# iloc 속성: 시리즈 객체의 행 번호를 사용하여 인덱싱할 때 사용, 양수, 음수 사용 가능
from pandas import Series

data = [1000, 2000, 3000]
s = Series(data=data)
print(s)
print(s.iloc[0])  # 1000
print(s.iloc[1])  # 2000
print(s.iloc[2])  # 3000
print(s.iloc[-1])  # 뒤에서 부터 첫 번째: 3000

# loc 속성: 시리즈로 부여된 인덱스(0, 1, 2)만 접근 가능하다.
from pandas import Series

data = [1000, 2000, 3000]
s = Series(data=data)
print(s)
print(s.loc[0])
print(s.loc[1])
print(s.loc[2])

# print(s.loc[-1])는 에러: 부여되지 않은 index이므로
# 딕셔너리 스타일, index, values
from pandas import Series

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)
print(s.iloc[2])  # 숫자 인덱싱 값으로 접근
print(s.loc['하겐다즈'])  # 부여된 index 값만 사용 가능
print(s['구구콘'])  # []로 접근 가능

# 시리즈 슬라이싱
# iloc
from pandas import Series

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)
print(s.iloc[0:2])

# loc
from pandas import Series

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

# 연속적이지 않은 값들에 대해서도 슬라이싱할 수 있다.
from pandas import Series

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)
print(s.iloc[[0, 2]])
print(s.loc[['메로나', '하겐다즈']])

# 시리즈 수정/추가/삭제
from pandas import Series

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)
s.loc['메로나'] = 500  # 값 수정
s.iloc[0] = 500  # iloc 속성 사용
s['메로나'] = 500  # [] 기호 사용
print(s)

# 추가
from pandas import Series

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

# 삭제: drop()
# drop() 메서드는 시리즈의 데이터를 제거하지 않고,
# 제거된 새로운 시리즈 객체를 리턴한다.
# 이는 실수로 원본 데이터를 수정하는 것을 방지하기 위한 안전 장치.
from pandas import Series

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)
print(s.drop('메로나'))  # print(s.drop(0)) 행 번호로 삭제 하는 것이 아니고, index 값으로 삭제
print(s)

# 시리즈 연산
from pandas import Series

mine = Series([10, 5, 3], index=["메로나", "구구콘", "하겐다즈"])
friend = Series([3, 10, 5], index=["하겐다즈", "구구콘", "메로나"])
total = mine + friend
print(total)

from pandas import Series

data1 = Series([10, 20, 30], index=["쭈쭈바", "콘", "막대바"])
data2 = data1 * 10
print(data2)

from pandas import Series

high = Series([42800, 42700, 42100, 42950, 43000])
low = Series([42150, 42150, 41300, 42150, 42350])

diff = high - low
print(diff.max())  # 저장된 시리즈 객체에서 최댓값을 리턴
print(max(diff))  # 같은 값을 리턴

# 필터링
# 비교연산: 크다, 작다, 같다, 다르다...
from pandas import Series

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

# c 변수에는 True 또는 False가 저장되어 있는데 이를 이용해서 색인하는 것을 '불리언 색인' 기능이라 한다.
# 가격이 1000원 이상인 값만 출력해야 될 때, 시리즈 객체의 [] 연산자에 True, False가 저장된 객체만 리턴하면 된다.
from pandas import Series

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

from pandas import Series

close = [42500, 42550, 41800, 42550, 42650]
open = [42600, 42200, 41850, 42550, 42500]
index = ['d5', 'd4', 'd3', 'd2', 'd1']

open = Series(data=open, index=index)
close = Series(data=close, index=index)

cond = close > open
print(cond)

# 불리언 색인 기능, 오른 날을 출력
from pandas import Series

close = [42500, 42550, 41800, 42550, 42650]
open = [42600, 42200, 41850, 42550, 42500]
index = ['d5', 'd4', 'd3', 'd2', 'd1']

open = Series(data=open, index=index)
close = Series(data=close, index=index)

cond = close > open
print(close[cond])

# 오른 값을 출력해보자
from pandas import Series

close = [42500, 42550, 41800, 42550, 42650]
open = [42600, 42200, 41850, 42550, 42500]
index = ['d5', 'd4', 'd3', 'd2', 'd1']

open = Series(data=open, index=index)
close = Series(data=close, index=index)
diff = close - open

cond = close > open
print(diff[cond])

# 정렬 sort_values()
from pandas import Series

data = [3.1, 2.0, 10.1, 5.1]
index = ['010', '020', '030', '040']
s = Series(data=data, index=index)
print(s)

# 정렬(오름차순)
s1 = s.sort_values()
print(s1)

# 정렬(내림차순)
s2 = s.sort_values(ascending=False)
print(s2)

# 순위 매기기 rank()
from pandas import Series

data = [3.1, 2.0, 10.1, 5.1]
index = ['010', '020', '030', '040']
s = Series(data=data, index=index)

print(s.rank())  # 값이 가장 작은 index가 1.0, 가장 큰 index가 4.0이 리턴 됬다.
print(s.rank(ascending=False))  # 작은 index가 4.0, 가장 큰 index가 1.0이 리턴된다.

# 엑셀 파일로 저장하기: 시리즈 객체로 표현된 데이터는 엑셀로 저장
# to_excel() 사용
# 터미널에 pip install openpyxl 설치 후 사용
from pandas import Series

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

# 인덱스 수정하기
from pandas import Series

data = [3.1, 2.0, 10.1, 5.1]
index = ['010', '020', '030', '040']
s = Series(data=data, index=index)
print(s)
s.index = 'A' + s.index
print(s)

 

Pandas.DataFrame

데이터프레임은 2차원 데이터를 표현하기 위한 자료구조이다. 엑셀 프로그램에서 하나의 시트(sheet)에 표현된 데이터가 2차원 데이터에 해당한다.

# Pandas.DataFrame - 1
# 2차원 데이터를 생성하는 방법 3가지
# 딕셔너리로 데이터프레임을 생성, 리스트로 데이터프레임을 생성, 리스트와 딕셔너리로 데이터프레임 생성.
# 1. 딕셔너리로 데이터프레임 생성
from pandas import DataFrame

data = {
    '사원번호': ['0001', '0002', '0003'],
    '사원명': ['홍길동', '이순신', '강감찬'],
    '급여': [250, 300, 280]
}
df = DataFrame(data)
print(df)

# 2. 로우(row) 단위로 저장된 리스트를 사용해서 데이터프레임을 생성
from pandas import DataFrame

data = [
    ["0001", "홍길동", 250],
    ["0002", "이순신", 300],
    ["0003", "강감찬", 280],
]
columns = ["사원번호", "사원명", "급여"]
df = DataFrame(data=data, columns=columns)
print(df)

# 3. 2번과 유사하게 행 단위로 표현, 이때 데이터에 레이블을 붙여서 각 행을 하나의 딕셔너리로 표현
from pandas import DataFrame

data = [
    {"사원번호": "0010", "사원명": "홍길동", "급여": 250},
    {"사원번호": "0020", "사원명": "이순신", "급여": 300},
    {"사원번호": "0030", "사원명": "강감찬", "급여": 280},
]
df = DataFrame(data=data)
print(df)

# 데이터프레임 인덱싱: 하나의 행의 대표하는 인덱싱을 지정하는 것은 매우 중요, 인덱스 단위로 접근해서
# 데이터를 가져오는 일이 빈번하므로 가독성을 고려해서 의미 있는 값으로 인덱스를 지정해야 한다.
# 정수 인덱스 RangeIndex
from pandas import DataFrame

data = [
    ["0010", "Hong", 250, 5.5],
    ["0020", "Lee", 300, 6.5],
    ["0030", "Kang", 280, 6.0],
]
columns = ['emno', 'ename', 'sal', 'comm']
df = DataFrame(data=data, columns=columns)
print(df)

# 인덱스 값을 지정, set_index() 메서드는 수정된 데이터프레임 객체를 리턴하므로 df라는 변수로 다시 바인딩한다.
from pandas import DataFrame

data = [
    ["0010", "Hong", 250, 5.5],
    ["0020", "Lee", 300, 6.5],
    ["0030", "Kang", 280, 6.0],
]
columns = ['emno', 'ename', 'sal', 'comm']
df = DataFrame(data=data, columns=columns)
df = df.set_index('emno')
print(df)

# 데이터프레임 객체를 생성과 동시에 인덱스를 지정
from pandas import DataFrame

data = [
    ["Hong", 250, 5.5],
    ["Lee", 300, 6.5],
    ["kang", 280, 6.0],
]
index = ["0010", "0020", "0030"]
columns = ["ename", "sal", "comm"]

df = DataFrame(data=data, index=index, columns=columns)
df.index.name = "emno"
print(df)

# 데이터프레임 칼럼 인덱싱 기호 []를 사용
from pandas import DataFrame

data = [
    ["0010", "Hong", 250, 5.5],
    ["0020", "Lee", 300, 6.5],
    ["0030", "Kang", 280, 6.0],
]
columns = ['emno', 'ename', 'sal', 'comm']
df = DataFrame(data=data, columns=columns)
df = df.set_index('emno')
list = ["sal", "comm"]
print(df[list])
# print(df[["sal","comm"]]) 위의 두행을 축약

# 데이터 프레임 로우 인덱싱 iloc, loc 사용
from pandas import DataFrame

data = [
    ["0010", "Hong", 250, 5.5],
    ["0020", "Lee", 300, 6.5],
    ["0030", "Kang", 280, 6.0],
]
columns = ['emno', 'ename', 'sal', 'comm']
df = DataFrame(data=data, columns=columns)
df = df.set_index('emno')

print(df.loc["0010"])
print(df.iloc[0])
print(df.iloc[-1])  # 음수 인덱스 사용 가능
print(df.loc[["0010", "0030"]])  # 순서 없이 출력 가능
print(df.iloc[[0, 2]])