Series
- 1차원 자료구조
- 같은 datatype만 저장 가능
DataFrame
- 2차원 자료구조
- Series의 집합
import numpy as np
import pandas as pd
# ndarray
arr = np.array([1,2,3,4,5], dtype=np.float64)
print(arr)
print("======"*10)
# Series
s = pd.Series([1, 2, 3, 4, 5], dtype=np.float64)
print(s) # index와 value가 같이 출력됨
print(s.values) # [1. 2. 3. 4. 5.] ndarray로 구성되어있음
print(s.index) # RangeIndex(start=0, stop=5, step=1) => pandas의 객체
print(s.dtype) # float64 실수임!
s = pd.Series([1,2,3,4,5],
dtype=np.float64,
index=['a','b','c','d','e'])
print(s)
# => 인덱스를 지정해서 Series를 만들면 있었던 숫자 index는 어케됨..??????
# 숫자 index는 그대로 사용 가능!! 내부에 숨어 있음~
print(s[0]) # 숫자 index 0 => 1.0
print(s['a']) # 지정 index a => 1.0
# print(s[100]) # error => 없는 index 여기서 찾지 마셈,,,, 오류 보낼거임,,
# print(s['ppp']) # error => 없는 index 여기서 찾지 마셈,,,, 오류 보낼거임,,
결론부터 말하자면 쓰지 마세용 !_!
# 지정 index를 숫자로 사용하면 어떻게 될까?
# 쓰지 마셈!
s = pd.Series([1,2,3,4,5],
dtype=np.float64,
index=[0, 2, 100, 6, 9])
print(s)
print(s[0]) # 1.0
# print(s[1]) # error
결론부터 말하자면 이런짓 하지 마세용 !_!
# 지정 index에 같은 index가 존재하면 어떻게 될까?
# 올 이게 되네? => 같은 index로 되어 있는 것을 indexing하면 Series로 결과를 가져옴!
# 그런데 이런짓은 하지마셈! index는 unique해야해...
s = pd.Series([1,2,3,4,5],
dtype=np.float64,
index=['c','b','c','k','m'])
print(s)
print(s['c'])
# indexing, slicing
# indexing은 ndarray나 list와 비슷함!
# 그런데 slicing은 달라달라, 난 다른 애들과는 좀 달라~👍
s = pd.Series([1,2,3,4,5],
dtype=np.float64,
index=['c','b','a','k','m'])
print(s)
print(s[0:3]) # 숫자 index를 이용한 slicing(ndarray, list와 동일) s['포함':'불포함']
print(s['c':'a']) # 지정 index를 이용한 slicing s['포함':'포함']
# boolean indexing, fancy indexing 적용 가능
s = pd.Series([1,2,3,4,5],
dtype=np.float64,
index=['c','b','a','k','m'])
print(s)
# 짝수만 뽑아내는 boolean indexing
print(s[s % 2 == 0])
# fancy indexing
print(s[[0,2]])
# Series를 만드는 또 다른 방법
# index를 key로, 저장하는 값을 value로 구성되는 자료구조
'''
s = pd.Series([1,2,3,4,5],
dtype=np.float64,
index=['c','b','a','k','m'])
'''
# dictionary를 이용해서 Series를 생성
my_dict = {'서울': 1000,
'인천': 500,
'제주': 200}
s = pd.Series(my_dict)
print(s)
# 연습문제!
# A공장의 2020년 1월 1일부터 10일간 생산량을 Series로 저장
# 생산량은 평균이 50이고 표준편차가 5인 정규분포에서 랜덤하게 생성(정수)
# index => 날짜
import numpy as np
import pandas as pd
from datetime import datetime, timedelta
start_day = datetime(2020,1,1)
print(start_day)
# list comprehension => list 생성시 제어문(for, if)을 이용
my_list = [int(x) for x in np.random.normal(50,5,(10,))]
print(my_list)
s1 = pd.Series(my_list,
index=[start_day + timedelta(days=x) for x in range(10)])
print(s1)
# B공장의 2020년 1월 1일부터 10일간 생산량을 Series로 저장
# 생산량은 평균이 70이고 표준편차가 8인 정규분포에서 랜덤하게 생성(정수)
start_day = datetime(2020,1,1)
my_list = [int(x) for x in np.random.normal(70,8,(10,))]
s2 = pd.Series(my_list,
index=[start_day + timedelta(days=x) for x in range(10)])
print(s2)
# 날짜별 생산량의 합
print(s1 + s2)
# 연습문제 2
# 날짜를 다르게 해서 생산량의 합을 구해봅시당
# A공장의 2020년 1월 1일부터 10일간 생산량을 Series로 저장
# 생산량은 평균이 50이고 표준편차가 5인 정규분포에서 랜덤하게 생성(정수)
# B공장의 2020년 1월 5일부터 10일간 생산량을 Series로 저장
# 생산량은 평균이 70이고 표준편차가 8인 정규분포에서 랜덤하게 생성(정수)
start_day_A_factory = datetime(2020,1,1)
start_day_B_factory = datetime(2020,1,5)
my_list = [int(x) for x in np.random.normal(50,5,(10,))]
s1 = pd.Series(my_list,
index=[start_day_A_factory + timedelta(days=x) for x in range(10)])
my_list2 = [int(x) for x in np.random.normal(70,8,(10,))]
s2 = pd.Series(my_list2,
index=[start_day_B_factory + timedelta(days=x) for x in range(10)])
print(s2)
# 날짜별 생산량의 합
print(s1 + s2)
: 2차원 matrix구조, Series의 집합
# DataFrame은 dictionary를 이용해서 만들면 편함~
import numpy as np
import pandas as pd
my_dic = {'이름': ['홍길동','아이유','김연아','신사임당'],
'학년': [4, 3, 1, 2],
'학점': [1.5, 2.4, 3.9, 4.5]}
df = pd.DataFrame(my_dic)
display(df)
# DataFrame의 기본 속성
print(df.shape) # (4,3)
print(df.values) # 2차원 ndarray
print(df.size) # DataFrame안의 요소 개수 => 12
print(df.ndim) # 2
print(df.index) # 행 index, RangeIndex(start=0, stop=4, step=1)
print(df.columns) # 열 index, Index(['이름', '학년', '학점'], dtype='object')
df.index.name = '학번'
df.columns.name = '학생정보'
display(df)
rename()
# DataFrame의 column명과 index명을 변경
# rename()
my_dic = {'이름': ['홍길동','아이유','김연아','신사임당'],
'학년': [4, 3, 1, 2],
'학점': [1.5, 2.4, 3.9, 4.5]}
df = pd.DataFrame(my_dic)
display(df)
# inplace = True => 원본을 수정하고 복사본을 만들지 않음
# inplace = False => 원본은 두고 복사본을 만듬
new_df = df.rename(columns = {'이름':'학생이름',
'학점':'평균평점'},
index={0:'one'},
inplace=False)
display(new_df)
set_index()
# DataFrame의 특정 column을 index로 설정!
# 이름 column을 index로 설정
# set_index()
my_dic = {'이름': ['홍길동','아이유','김연아','신사임당'],
'학년': [4, 3, 1, 2],
'학점': [1.5, 2.4, 3.9, 4.5]}
df = pd.DataFrame(my_dic)
display(df)
new_df = df.set_index('이름', inplace=False)
display(new_df)