1.  Pandas 란

🍯  pandas 라이브러리 : 파이썬에서 데이터 분석과 처리를 쉽게 처리할 수 있게 도와준다
🍯  pandas는 numpy를 기반으로 만들어졌지만 좀 더 복잡한 데이터 분석에 특화
🍯  numpy가 같은 데이터 타입의 배열만 처리할 수 있는데 반해 pandas는 데이터 타입이 다양하게 섞여 있을 때도 처리 가능

 

    📌  공식 홈페이지 : https://pandas.pydata.org/

 

pandas - Python Data Analysis Library

pandas pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool, built on top of the Python programming language. Install pandas now!

pandas.pydata.org


2.  구조적 데이터 생성하기

1) Series를 활용한 데이터 생성

🍋  pandas에서 데이터를 생성하는 가장 기본적인 방법은 Series()를 이용하는 것
🍋  Series()를 이용하면 Series 형식의 구조적 데이터(라벨을 갖는 1차원 데이터)를 생성할 수 있음.

 

   📌  다음은 Series()를 이용해 Series 형식의 데이터를 생성하는 방법

s = pd.Series(seq_data)



🍋  Series()의 인자로는 시퀀스 데이터가 들어감
🍋  시퀀스 데이터로는 리스트와 튜플 타입의 데이터를 모두 사용할 수 있지만 주로 리스트 데이터를 이용

import pandas as pd

s1 = pd.Series([10, 20, 30, 40, 50])
print(s1)
s1

 

 

📌  위 쪽의 결과는 print(s1)의 결과

      아래 쪽의 결과는 s1 만 실행했을 때 출력되는 결과 (주피터 노트북 사용 )

 

 

 

 

 

 

 


s1 = pd.Series([10, 20, 30, 40, 50])
s1.index
# 실행 출력
# RangeIndex(start=0, stop=5, step=1)

s1.values

s1.values 결과

 

🍋  numpy의 경우 배열의 모든 원소가 데이터 타입이 같아야 했지만 pandas의 경우에는 원소의 데이터 타입이 달라도 저장 가능

s2 = pd.Series(['a', 'b', 'c', 1, 2, 3])  # 넘파이 였다면 모두 문자열로 변경.
print(s2)
# 0    a
# 1    b
# 2    c
# 3    1
# 4    2
# 5    3
# dtype: object
# 변수 s2에는 문자열과 숫자가 혼합이 되어 있어서 타입이 object

 


3) np.nan

🍋  데이터가 없으면 numpy를 임포트한 후 np.nan으로 데이터가 없음을 표시할 수 있음

import numpy as np
s3 = pd.Series([np.nan, 10, 30])
print(s3)  
'''
출력결과)
0     NaN  -> 데이터를 위한 자리 index는 있지만 실제 값이 없음.
1    10.0
2    30.0
dtype: float64
'''

 

 

4) index

🍋   Series 데이터를 생성할 때 인자로 index 추가 가능

         ▶️  인자로 index를 명시적으로 입력하면 Series 변수(s)의 index에는 자동 생성되는 index 대신 index_seq가 들어가게 됨

         ▶️  index_seq도 리스트와 튜플 타입의 데이터를 모두 사용가능하지만 주로 리스트를 사용

         ▶️ 주의할 점은 seq_data의 항목 개수와 index_seq의 항목 개수가 같아야

s = pd.Series(seq_data, index = index_seq)
# 어느 가게의 날짜별 판매량을 pandas의 Series 형식으로 입력. 하루는 데이터가 없어서 np.nan을 입력
index_data = ['2018-10-07', '2018-10-08', '2018-10-09', '2018-10-10']
s4 = pd.Series([200, 195, np.nan, 205], index=index_data)
s4

s4 실행결과

s4.index
# Index(['2018-10-07', '2018-10-08', '2018-10-09', '2018-10-10'], dtype='object')

 

 

🍋  파이썬의 딕셔너리를 사용하면 데이터와 index를 함께 입력할 수 있음

        ▶️  입력 인자로 딕셔너리 데이터를 입력하면 딕셔너리 데이터의 키 key와 값 value이 각각 Series 데이터의 index와 values로 들어감

s = pd.Series(dict_data)
s5 = pd.Series({'국어': 100, '영어': 95, '수학': 90})
s5
'''
국어,100
영어,95
수학,90
'''

 

3. 날짜 자동 생성 : data_range()

 

🚀  입력해야 할 날짜가 많으면 pandas에서 날짜를 자동생성하는 data_range() 사용
🚀  몇 가지 설정만 하면 원하는 날짜를 자동으로 생성하므로 날짜 데이터를 입력할 때 편리

 

pd.date_range(start=None, end=None, periods=None, freq='D'


    👾  start는 시작날짜, end는 끝날짜
    👾  periods는 날짜 데이터 생성 기간 = 생성 갯수
    👾  freq는 날짜 데이터 생성 주기
    👾  start는 필수이고, end나 periods는 둘 중 하나만 있어도 됨
    👾  freq는 입력하지 않으면 'D' 옵션이 설정돼 달력날짜 기준으로 하루씩 증가

# 시작 날짜와 끝 날짜를 지정해 날짜 데이터를 생성. 하루씩 증가한 날짜 데이터가 생성.
pd.date_range(start='2019-01-01', end='2019-01-07')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

 


 

1) 날짜 데이터 형식

 

🚀  날짜 데이터를 입력할 때 yyyy-mm-dd  yyyy/mm/dd, yyyy.mm.dd, mm-dd-yyyy, mm/dd/yyyy, mm.dd.yyyy 

      형식 사용가능
        ▶️ 대신 출력은 yyyy-mm-dd 형식으로 생성

pd.date_range(start='2019/01/01', end='2019.01.07')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

pd.date_range(start='2019-01-01', end='01.07.2019')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

# 끝 날짜를 지정하지 않고 periods만 입력해서 날짜 생성.
pd.date_range(start='2019-01-01', periods=7)
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

 


 

2)  pandas data_range() 함수의 freq 옵션

약어 설명 사용  예
D 달력 날짜 기준 하루 주기 하루 주기: freq = 'D',  이틀 주기: freq = '2D'
B 업무 날짜 기준 하루 주기 업무일(월~금) 기준으로 생성, freq = 'B',  freq = '3B'
W 일요일 시작 기준 일주일 주기 월요일: W-MON, 화요일: W-TUE, freq = 'W',
freq = 'W-MON'
M 월말 날짜 기준 주기 한 달 주기: freq = 'M', 네 달 주기: freq = '4M'
BM 업무 월말 날짜 기준 주기 freq = 'BM' , freq = '2BM'
MS 월초 날짜 기준 주기 freq = 'MS' , freq = '2MS'
BMS 업무 월초 날짜 기준 주기 freq = 'BMS' , freq = '2BMS'
Q 분기 끝 날짜 기준 주기 freq = 'Q' , freq = '2Q'
BQ 업무 분기 끝 날짜 기준 주기 freq = 'BQ' , freq = '2BQ'
QS 분기 시작 날짜 기준 주기 freq = 'QS' , freq = '2QS'
BQS 업무 분기 시작 날짜 기준 주기 freq = 'BQS' , freq = '2BQS'
A 일년 끝 날짜 기준 주기 freq = 'A' , freq = '2A'
BA 업무 일년 끝 날짜 기준 주기 freq = 'BA' , freq = '2BA'
AS 일년 시작 날짜 기준 주기 freq = 'AS' , freq = '2AS'
BAS 업무 일년 시작 날짜 기준 주기 freq = 'BAS' , freq = '2BAS'
H 시간 기준 주기 1시간 주기: freq = 'H' , 2시간 주기: freq = '2H'
BH 업무 시간 기준 주기 업무 시간(09:00 ~ 17:00) 기준으로 생성
T, min 분 주기 10분 주기: freq = '10T' , 30분 주기: freq = '30min'
S 초 주기 1초 주기: freq = 'S' , 10초 주기: freq = '10S'
# 2일씩 증가하는 날짜를 생성
pd.date_range(start='2019-01-01', periods=4, freq='2D')
# DatetimeIndex(['2019-01-01', '2019-01-03', '2019-01-05', '2019-01-07'], 
# dtype='datetime64[ns]', freq='2D')

 

# 달력의 요일을 기준으로 일주일씩 증가하는 날짜를 생성.
pd.date_range(start='2019-01-06', periods=4, freq='W')
# DatetimeIndex(['2019-01-06', '2019-01-13', '2019-01-20', '2019-01-27'], 
# dtype='datetime64[ns]', freq='W-SUN')
# 업무일 기준 2개월 월말 주기로 12개 날짜를 생성.
pd.date_range(start='2019-01-01', periods=12, freq='2BM')
'''
DatetimeIndex(['2019-01-31', '2019-03-29', '2019-05-31', '2019-07-31',
               '2019-09-30', '2019-11-29', '2020-01-31', '2020-03-31',
               '2020-05-29', '2020-07-31', '2020-09-30', '2020-11-30'],
                dtype='datetime64[ns]', freq='2BM'
'''

 

# 분기 시작일을 기준으로 4개의 날짜를 생성
pd.date_range(start='2019-01-01', periods=4, freq='QS')
# DatetimeIndex(['2019-01-01', '2019-04-01', '2019-07-01', '2019-10-01'], 
# dtype='datetime64[ns]', freq='QS-JAN')

 


 

[ 시간 생성 ]

# 1시간 주기로 10개의 시간을 생성한 예
pd.date_range(start='2019-01-01 08:00', periods=10, freq='H')
'''
DatetimeIndex(['2019-01-01 08:00:00', '2019-01-01 09:00:00',
               '2019-01-01 10:00:00', '2019-01-01 11:00:00',
               '2019-01-01 12:00:00', '2019-01-01 13:00:00',
               '2019-01-01 14:00:00', '2019-01-01 15:00:00',
               '2019-01-01 16:00:00', '2019-01-01 17:00:00'],
              dtype='datetime64[ns]', freq='H')
'''
# 업무 시간을 기준으로 1시간 주기로 10개의 시간을 생성하는 예
# 업무 시간은 9시 부터 17시까지이므로 start시간을 9시 이전으로 설정해도 9시 부터 표시.
pd.date_range(start='2019-01-01 08:00', periods=10, freq='BH')
'''
DatetimeIndex(['2019-01-01 09:00:00', '2019-01-01 10:00:00',
               '2019-01-01 11:00:00', '2019-01-01 12:00:00',
               '2019-01-01 13:00:00', '2019-01-01 14:00:00',
               '2019-01-01 15:00:00', '2019-01-01 16:00:00',
               '2019-01-02 09:00:00', '2019-01-02 10:00:00'],
              dtype='datetime64[ns]', freq='BH')
'''
# date_range()를 이용해 Series의 index를 지정한 예.
index_date = pd.date_range(start='2019-03-01', periods=5, freq='D')
s = pd.Series([51, 62, 55, 49, 58], index=index_date)
s
'''
2019-03-01,51
2019-03-02,62
2019-03-03,55
2019-03-04,49
2019-03-05,58
'''

 

 

 

 

[ 내용 참고: IT 학원 강의 ]

+ Recent posts