#3. Pandas

leeby.dev·2022년 3월 16일
0

MachinLearning

목록 보기
2/3

Pandas

  • conda install pandas

Series

  • 1차원 자료구조
  • 같은 datatype만 저장 가능

DataFrame

  • 2차원 자료구조
  • Series의 집합

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   실수임!

index를 지정해보자!

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를 숫자로 사용하면 어떻게 될까?

결론부터 말하자면 쓰지 마세용 !_!

# 지정 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에 같은 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, 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)

연습문제1

# 연습문제!
# 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

# 연습문제 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)

DataFrame

: 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)

DataFrame의 column명과 index명을 변경

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)

# DataFrame의 특정 column을 index로 설정!

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)

profile
내가.. 개발자?! ㅇ0ㅇ

0개의 댓글