4 분 소요

Pandas 라이브러리 (데이터처리용)

데이터 분석을 위한 파이썬 라이브러리로 데이터 객체(Data Object)를 제공 ( 1차원 배열은 Series , 2차원 배열은 Data Frame )
주로 import pandas as pd 사용한다.

Data Object

  • Series: 리스트의 값을 넘겨주어 객체 형성 ( index: 아무 지정이 없으면 0부터 시작하여 1씩 증가하는 정수 )
  • Data Frame: 다양한 형태의 데이터를 받아 객체 형성 ( 데이터 값의 위치를 지정하는 index, columns 이 있음)
import pandas as pd
import numpy as np
# 2차원 - Data Frame
df = pd.DataFrame({'A':1.,
                    'B':pd.Timestamp('20200302'),
                    'C':pd.Series(1,index=list(range(4)), dtype='float32'),
                    'D':np.array([3]*4, dtype='int32'),
                    'E':pd.Categorical(['test','train','test','train']),
                    'F':'foo',
                    'G': np.random.randn(4)
                  })

# 1차원 - Series
s = pd.Series([1,2,5,np.nan,6,8])

파일 읽고 쓰기

# csv 파일 읽고 쓰기
df.to_csv('foo.csv')  #쓰기
pd.read_csv('foo.csv') # 읽기

# 엑셀 파일 읽고 쓰기
df.to_excel('foo.xlsx', sheet_name='샘플데이터') #쓰기
pd.read_excel('foo.xlsx', sheet_name='샘플데이터',index_col=None, na_values=['NA']) 

# hdf5(Hierachical Data Format version 5)  파일 읽고 쓰기
df.to_hdf('foo.h5','df') #쓰기
pd.read_hdf('foo.h5','df')

Data Frame 조작

df.head()
df.tail()
df.describe() # 수치자료만 요약 , count,mean, std, min, 25%, 50% 75% max
df.T # transepose
df.['A'] # A column 선택 df.A 와 동일 , Series 형태임
df.sort_index(axis=1, ascending=False) # 1: y 기준으로 정렬, 0: x 기준으로 정렬
df.sort_values(by='B') # B column 정렬

Data Frame 슬라이싱

df[0:3] # 행번호 슬라이싱 3번째 행은 선택이 안됨
# index 이름으로, 이경우는 처음과 끝이 모두 포함 , df1['20130102'] 와 같이 범위 지정하지 않으면 에러 발생
df['20130102':'20130104'] 

Data Frame .loc , .iloc :데이터의 일부 선택

# .loc 일부를 선택하고자 하는 경우
df.loc[:,['A','B']] # A,B 컬럼 선택
df.loc[['20130102':'20130104':['A','B']] # A,B 컬럼, 행사이 조건

# .iloc :index를 이용하여 선택하고자 하는 경우
df.iloc[3]  # 4번째 행의 자료임
df.iloc[3:5,0:2]  # 4~5 행 * 1~2 열
df.iloc[[1,2,4],[0,2]] # 2~4 행 * 1~2 열

Data Frame 조건부 선택

df[df.A > 0] # 변수 A 열에서 양수 값만을 선택
df[df > 0] # 양수값은 유지하고 나머지는 NAN 으로
df[df['E'].isin(['test'])] # test 만 필터 설정

Data Frame 데이터 값 변경

df[df.A > 0] # 변수 A 열에서 양수 값만을 선택
df[df > 0] # 양수값은 유지하고 나머지는 NAN 으로
df[df['E'].isin(['test'])] # test 만 필터 설정

df['H'] = ['one','one','two','three'] # H컬럼 추가

# index에서 지정한것만 매칭되고, 나머진 None
df['I'] = pd.Series([10,20,30,40,50,60], index=[2,3,4,5,6,7]) 

결측값

df.dropna(how='any')  # 결측치 제외, all 하면 다나옴
df.fillna(value=-99)  # 결측치를 -99로 세팅
pd.isna(df) # 결측지 T/F

Stats & Operation

df.mean(0) # 열평균 , 결측치제외됨
df.mean(1) # 행평균 , 결측치제외됨

s = pd.Series([1,2,3,np.nan,5,6], index=['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'] ).shift(2)  # 2개의 행을 밀어낸다.
df.loc[:,list('DFG')].sub(s, axis='index') # DFG 열에서 s 데이터 뺄셈을 한다.

apply(), count()

s = pd.Series(np.random.randint(1,7,size=600))
s.value_counts() # frequency table (도수분포표)

df.apply( np.cumsum ) # df 전체 요소에 대해 누적Sum , Str 타입도 적용됨

df.loc[:,['I']].apply( lambda x: x.max()-x.min() ) # 람다 함수도 적용가능

String 관련 메서드

  • Text data를 취급하는 경우 파이썬에서는 두 가지 형태가 있음
    • object -dtype NumPy array
    • StringDtype extension type (Pandas 에서 추천하는 방식)
  • Series 타입에서 str 속성 아래 다양한 메서드가 있음
    • lower(), upper(), len()
    • strip(), lstrip(), rstrip()
    • replace(‘ ‘, ‘’), split(‘’), get()

Data Frame 합치기

  • concat() : 같은 형태의 자료를 이어서 하나로 만들어 주는 메서드
  • append() : 기존 Data Frame에 하나의 행을 추가하는 메서드
  • merge() : 다른 형태의 자료를 열 (column) 기준으로 합치는 메서드, 키 중복여부에 따라 결과가 달라짐
# concat 예제
df6 = pd.DataFrame(np.random.randn(5,2))
pieces = [df6[:2], df6[2:4], df6[4:]]
pd.concat(pieces)  # 행기준으로 연결됨

# append 예제
s = df6.iloc[4]
df6.append(s, ignore_index=True) # 한줄 붙임
# merge 예제 1
왼쪽객체 = pd.DataFrame({'기준변수':['foo','bar'], '왼쪽값':[1,2]})
오른쪽객체 = pd.DataFrame({'기준변수':['foo','bar'], '왼쪽값':[4,5]})
merged = pd.merge(왼쪽객체,오른쪽객체, on='기준변수'  )  # 왼쪽,오른쪽 merge
	기준변수	왼쪽값_x	왼쪽값_y
0	foo	1	4
1	bar	2	5
# merge 예제 2
왼쪽객체 = pd.DataFrame({'기준변수':['foo','foo'], '왼쪽값':[1,2]})
오른쪽객체 = pd.DataFrame({'기준변수':['foo','foo'], '왼쪽값':[4,5]})
merged = pd.merge(왼쪽객체,오른쪽객체, on='기준변수'  )  # 기준변수가 중복되어 있는경우 행과 열이 동시확장되면서 커짐
기준변수	왼쪽값_x	왼쪽값_y
0	foo	1	4
1	foo	1	5
2	foo	2	4
3	foo	2	5

Gouping

df = pd.DataFrame( {'A':['foo','bar','foo','bar'],
                     'B':['one','one','two','two'],
                     'C':np.random.randn(4),
                     'D':np.random.randn(4) })
df.groupby('B').sum()  # B열을 기준으로 합침
df7.groupby('A').mean() # A열을 기준으로 합침

Reshaping

# zip(*iterable)은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다.
인텍스가2개 = list(zip(*[['bar','bar','baz','baz'],
                      ['one','two','one','two']]))
idx = pd.MultiIndex.from_tuples(인텍스가2개, names=['first','second'])
idx
MultiIndex([('bar', 'one'),
            ('bar', 'two'),
            ('baz', 'one'),
            ('baz', 'two')],
           names=['first', 'second'])
df8= pd.DataFrame(np.random.randn(4,2), index = idx, columns=['A','B'])
df8
	A	B
first	second		
bar	   one  	-0.633631	0.061068
       two  	0.779590	-0.493393
baz	   one  	-0.135701	1.971062
       two  	0.071933	1.121571
df8.stack()   #  colum이 열로 치환 (압축), .unstack()  반대
first  second   
bar    one     A   -0.633631
               B    0.061068
       two     A    0.779590
               B   -0.493393
baz    one     A   -0.135701
               B    1.971062
       two     A    0.071933
               B    1.121571
dtype: float64

Pivot, crosstab

df9 = pd.DataFrame({'A':['one','one','two','three']* 6,
                    'B':['A','B','C']* 8,
                    'C':['foo','foo','foo','bar','bar','bar']* 4,
                    'D':np.random.randn(24),
                    'E':np.random.randn(24),
                    'F':[datetime.datetime(2013,i,1) for i in range(1,13)] 
                         + [datetime.datetime(2013,i,15) for i in range(1,13)] })

pd.pivot_table(df9,values='D', index=['A','B'], columns=['C'], margins=True, aggfunc=np.std)                         
	C	bar	foo	All
A	    B			
one	  A	0.815924	0.107406	0.856917
      B	0.163015	0.698839	0.554327
      C	0.116648	1.156726	0.690643
three A	0.715409	NaN	0.715409
      B	NaN	0.116662	0.116662
      C	1.405007	NaN	1.405007
two	  A	NaN	1.791535	1.791535
      B	0.202609	NaN	0.202609
      C	NaN	0.394769	0.394769
All		  0.859404	1.130013	0.965848
pd.crosstab( [df9['A'], df9['B']] , df['C'])
	C	-1.728165	-0.581185	-0.031923	0.596616	1.076459
A	B					
one	A	0	1	0	0	0
B	1	0	0	1	0
three	A	0	0	1	0	0
two	C	0	0	0	0	1

Time Series Data : pd.date_range( ‘yyyy-mm-dd’ , periods= , freq= )

  • Date times (Timestamp): 특정 날짜와 시간을 설정 (datetime.datetime 과 유사), pd.Timestamp(‘2020-03-02’)
  • Time deltas (Timedelta): 시간 간격 설정 및 계산 (datetime.timedelta 와 유사), pd.Timedelta(‘4 day’)
  • Time spans (Period): 주기(frequency)에 따라 시간 영역을 설정
  • Date offsets (DateOffset): 상대적 시간 간격 설정, pd.offsets.BDay() 비지니스데이 계산

Categorical Data

df = pd.DataFrame({'id':[1,2,3,4,5,6],'r_grade':['a','b','b','a','a','f']})
df['grade'] = df['r_grade'].astype('category') #  카타고리 설정
df['grade'].cat.categories  # 카타고리  표시

댓글남기기