Python Pandas 기초
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 # 카타고리 표시
댓글남기기