Python 데이터분석 라이브러리(3) - Pandas(Series)
Data-Science 강의는 여러 절로 구성되어 있습니다.
- Python 데이터분석 라이브러리(1) - NumPy
- Python 데이터분석 라이브러리(2) - NumPy(Exercise)
- Python 데이터분석 라이브러리(3) - Pandas(Series)
- Python 데이터분석 라이브러리(4) - Pandas(DataFrame 생성)
- Python 데이터분석 라이브러리(5) - Pandas(DataFrame indexing)
- Python 데이터분석 라이브러리(6) - Pandas(DataFrame functions)
- Python 데이터분석 라이브러리(7) - Pandas(DataFrame merge)
- Python 데이터분석 라이브러리(8) - Pandas(DataFrame 제어)
- Python 데이터분석 라이브러리(9) - Pandas(DataFrame Grouping)
- Python 데이터분석 라이브러리(10) - Pandas(Exercise)
Pandas
이번에는 Pandas
에 대해서 알아보겠습니다.
Pandas는 고유하게 정의한 Series와 DataFrame이라는 자료구조를 사용합니다.
-
Series
: 동일한 데이터 타입의 복수개의 성분으로 구성됩니다. -
DataFrame
: 서로 같거나 다른 여러 데이터 타입에 대해 Table형식으로 구성됩니다. R의 DataFrame과 같은 형태입니다.
Pandas를 사용하기 위해서는 conda 명령어나 pip를 이용하여 먼저 Pandas module을 설치해야 합니다.
conda install pandas
Series 생성
# Series 생성
# numpy array와 비교해서 확인
import numpy as np
import pandas as pd
# ndarray (dtype=np.float64)
arr = np.array([-1,5,10,99], dtype=np.float64)
print(arr)
print(arr.dtype)
# ndarray (dtype=np.object)
arr = np.array([-1,5,3.14,"hello"], dtype=np.object)
print(arr)
print(arr.dtype)
###########################
s = pd.Series([-1,5,10,99], dtype="float64") # dtype=np.float64
print(s) # Series 출력(index와 value를 같이 출력)
print("Series의 value : {}".format(s.values)) # [-1. 5. 10. 99.]
print("Series의 value type : {}".format(type(s.values))) # <class 'numpy.ndarray'>
print("Series의 value data type : {}".format(s.dtype)) # float64
print("Series의 index data : {}".format(s.index)) # RangeIndex(start=0, stop=4, step=1)
print("Series의 index type : {}".format(type(s.index))) # <class 'pandas.core.indexes.range.RangeIndex'>
Series index 지정
# Series 생성 시 index를 지정 가능
# 숫자인덱스는 기본으로 사용가능
import numpy as np
import pandas as pd
s = pd.Series([1,5,-8,10],
dtype=np.int32,
index=['c','b','a','k'])
print(s)
print("s[1] : {}".format(s[1])) # 5
print("s['c'] : {}".format(s['c'])) # 1
print("type(s['c']) : {}".format(type(s['c']))) # <class 'numpy.int32'>
############################################
s = pd.Series([1,5,-8,10],
dtype=np.int32,
index=['c','b','c','k']) # index가 같아도 되는가? (된다.)
print(s)
print("s['c'] : {}".format(s['c'])) # c 1
# c -8
# 만약 같은 index가 존재하고 해당 index로 값을 조회하면
# Series 형태로 return
print("type(s['c']) : {}".format(type(s['c']))) # <class 'pandas.core.series.Series'>
############################################
s = pd.Series([1,5,-8,10],
dtype=np.int32,
index=['c','b','a','k'])
print(s)
# Slicing
print("s[0:3]\n{}".format(s[0:3])) # Series
print("s['c':'k']\n{}".format(s['c':'k'])) # Series
# s['c':'k'] 으로 slicing할 경우 'c'부터 'k'(포함)까지 slicing
# Fancy Indexing & Boolean Indexing
print("s[[0,2]]\n{}".format(s[[0,2]])) # Series(Fancy Indexing이용)
print("s[s%2==0]\n{}".format(s[s%2==0])) # Series(Boolean Indexing이용)
result = 0;
for x in range(len(s)):
result += s[x]
print("for문을 이용한 합계 : {}".format(result))
print("sum() 함수를 이용한 합계 : {}".format(s.sum()))
Series 연습
# A 공장의 2019-01-01부터 10일간 생산량을 Series로 저장
# 생산량은 평균이 50이고 표준편차가 5인 정규분포에서 random하게 생성(정수)
# 형식) 2019-01-01 52
# B 공장의 2019-01-01부터 10일간 생산량을 Series로 저장
# 생산량은 평균이 70이고 표준편차가 8인 정규분포에서 random하게 생성(정수)
# 날짜별로 모든 공장의 생산량 합계를 구하세요!
import numpy as np
import pandas as pd
from datetime import date, datetime, timedelta
from dateutil.parser import parse
start_day = datetime(2019,1,1)
factory_A = pd.Series([int(x) for x in np.random.normal(50,5,(10,))],
index=[start_day + timedelta(days=x) for x in range(10)])
start_day = parse("2019-01-01")
factory_B = pd.Series([int(x) for x in np.random.normal(70,8,(10,))],
index=[start_day + timedelta(days=x) for x in range(10)])
# print(factory_A)
# print(factory_B)
print(factory_A + factory_B)
## 생각해볼 문제 - 만약 서로 날짜가 다르면 어떻게 될까?
## index가 같지 않을 경우 연산의 결과는 NaN
## 어떻게 하면 NaN이 나오지 않고 정상적으로 처리할 수 있을까?
## index를 맞춰보아요!
start_day = datetime(2019,1,5)
factory_A = pd.Series([int(x) for x in np.random.normal(50,5,(10,))],
index=[start_day + timedelta(days=x) for x in range(10)])
index_a = set(factory_A.index)
index_b = set(factory_B.index)
index_a_b = index_a - index_b # Factory B에 추가
index_b_a = index_b - index_a # Factory A에 추가
for i in index_a_b:
factory_B[i] = 0;
for i in index_b_a:
factory_A[i] = 0;
print(factory_A + factory_B)
###################################
# 딕셔너리와 동일하게 추가할 key에 값을 대입해서 Series에 데이터를 추가
# drop(key)을 이용하여 키와 값을 삭제. (삭제된 Series return)
s = pd.Series([1,2,3,4])
print(s)
s[4] = 5 # 추가할 key와 value값을 대입해서 Series에 데이터 추가
print(s)
s = s.drop(2) # index 2가 삭제
print(s)
Dictionary로 Series 생성
# Dictionary를 이용하여 Series 생성
# Dictionary의 key가 index로 사용된다.
# Series 자체의 이름과 index의 이름을 지정할 수 있다.
# Python의 list 혹은 numpy array를 이용해서 index 변경
import numpy as np
import pandas as pd
my_dict = { "서울" : 1000, "부산" : 2000, "인천": 3000 }
s = pd.Series(my_dict)
s.name = "지역별 가격데이터"
s.index.name = "지역명"
print(s)
s.index = ["SEOUL", "BUSAN", "INCHON"]
s.index.name = "REGION"
print(s)
End.
Data-Science 강좌는 아래의 책과 사이트를 참조했습니다. 조금 더 자세한 사항을 알고 싶으시면 해당 사이트를 방문하세요!!