7. Pandas
- Pandas : 구조화된 데이터의 처리를 지원하는 Python 라이브러리. Python계의 엑셀
- panel data의 약자
- 고성능 array 계산 라이브러리인 numpy와 통합하여 강력한 "스프레드시트" 처리 기능을 제공
- 인덱싱, 연산용 함수, 전처리 함수 등을 제공함
- 데이터 처리 및 통계 분석을 위해 사용
- pandas 설치
conda create -n upstage python=3.9 # 가상환경 생성
activate upstage # 가상환경 실행
conda install pandas # pandas 설치
jupyter notebook # 주피터 실행하기
import pandas as pd
data_url = 'https:// ###' # DAta URL
df_data = pd.read_csv(data_url, sep='\s+', header = None) # csv타입 데이터 로드, separate는 빈공간으로 지정하고 column은 없음
df_data.head() # 처음 다섯줄 출력
df_data.columns = ['a','b','c','cd'] # Column Header 이름 지정
df_data.head()
1. series
- DataFrame 중 하나의 Column에 해당하는 데이터 모음 Object. column vector를 표현하는 object
- DataFrame : Data Table 전체를 포함하는 Object
list_data = [1,2,3,4,5]
list_name = ['a','b','c','d','e']
example_obj = Series(data = list_data, dtype = np.float32, index = list_name)
example_obj
example_obj['a'] # data index에 접근하기
example_obj['a'] = 3.2 # data index에 값 할당하기
example_obj.astype(float) # 데이터 타입 바꾸기. float64
example_obj.values # 값 리스트만
example_obj.index # 인덱스 리스트만
exmaple_obj.name = 'number' # column의 이름 지정해주기
example_obj.index.name = 'alphabet' # index의 이름 지정해주기
2. dataframe
- Series를 모아서 만든 Data Table = 기본 2차원
- dataframe 생성
from pandas import Series, DataFrame
import pandas as pd
import numpy as np
raw_data = {'first_name':['Jason','Molly','Tina'], 'age': [42,52,34]}
df = pd.DataFrame(raw_data, columns = ['first_name', 'age'])
df
DataFrame(raw_data, columns = ['age']) # column 선택
DataFrame(raw_data, columns = ['first_name','age','debt'] # 새로운 column 추가
df.first_name # column 선택 - series 추출
df['first_name'] # column 선택 - series 추출
df.loc[1] # loc - index location - index 이름
df['age'].iloc[1:] # iloc - index position - index number
df.T # transpose
df.values # 값 출력
df.to_csv() # csv 변환
del df['debt'] # column 삭제
df.drop('debt', axis = 1) # df 자체는 그대로인데 debt를 삭제한 데이터를 출력할 뿐
3. selection & drop
* Selection with column names
df['account'].head(3) # 한개의 column 선택시
df[['account','street','state']].head(3) # 1개 이상의 column 선택시
df[:3] # column 이름 없이 사용하는 index number는 row기준으로 선택
df["account"][:3] # column 이름과 함께 row index 사용시 해당 column만
conda install --y xlrd # 엑셀 다루는 모듈 설치
df = pd.read_excel(".asdasf.xlsx")
df.head()
* data drop
df.drop(1) # df 자체는 변화 없음
df.drop([0,1,2,3]) # 한 개 이상의 index number로 drop
df.drop(1, inplace=True) # df 자체에 변화주려면 inplace 사용
4. dataframe operations
* series operation
s1 = Series(range(1,6),index=list("abcde"))
s2 = Series(range(5,11),index=list('bcdef'))
s1.add(s2) # index 기준으로 연산 수행
s1 + s2 # 겹치는 index가 없을 경우 NaN값으로 반환
* dataframe operation
- df는 column과 index를 모두 고려
- add operation을 쓰면 NaN값 0으로 변환가능
- Operation types: add, sub, div, mul
* series + dataframe
- axis를 기준으로 row broadcasting 실행
5. lambda, map, apply
* map for series
- pandas의 series type의 데이터에도 map 함수 사용 가능
- function 대신 dict, sequence형 자료등으로 대체 가능
s1 = Series(np.arange(10))
s1.head(5)
s1.map(lambda x: x**2).head(5)
z = {1:'A', 2:'B', 3:'C'}
s1.map(z).head(5) # dict type으로 데이터 교체. 없는 값은 NaN
s2 = Series(np.arange(10,20))
s1.map(s2).head(5) # 같은 위치의 데이터를 s2로 전환
* replace function
- map 함수의 기능중 데이터 변환 기능만 담당
- 데이터 변환시 많이 사용하는 함수
df.sex.replace({'male':0, "female":1}).head() # dict type 적용
df.sex.replace(['male','female'],[0,1], inplace=True) # Target list, Conversion list
df.head(5)
* apply for dataframe
- map과 달리 series 전체(column)에 해당 함수를 적용
- 입력 값이 series 데이터로 입력 받아 handling 가능
df_info = df[["earn","height","age"]]
df_info.head()
f = lambda x : x.max() - x.min()
df_info.apply(f)
- 내장 연산 함수를 사용할 때도 똑같은 효과를 거둘 수 있음. mean, std등 사용가능
df_info.sum()
df_info.apply(sum)
- sclar 값 이외에 seires값의 반환도 가능함
* applymap for dataframe
- series 단위가 아닌 elemnent 단위로 함수를 적용함
- series 단위에 apply를 적용시킬 때와 같은 효과
6. pandas built-in functions
* describe
- Numberic type 데이터의 요약 정보를 보여줌
* unique
- series data의 유일한 값을 list를 반환함
* sum
- 기본적인 column 또는 row 값의 연산을 지원함.
- axis=0 : column별. axis=1 : row별
- sub, mean, min, max, count, median, mad, var 등
* isnull
- column 또는 row 값의 NaN(null) 값의 index를 반환
* sort_values
- column 값을 기준으로 데이터를 sorting
- ascending을 이용해 오름차순, 내림차순 결정.
* Correlation & Covariance
- 상관계수와 공분산을 구하는 함수
- corr, cov, corrwith
7. Groupby
- SQLgroupby 명령어와 같음
- split->apply->combine
- 과정을 거쳐 연산함
df.groupby("Team")['Points'].sum() # 묶음의 기준이 되는 컬럼.적용받는 컬럼.적용받는 연산
df.groupby("Team","Year")['Points'].sum() # 한 개 이상의 column을 묶을 수 있음
* Hierarchical index
- Groupby 명령의 결과물도 결국은 dataframe
- 두 개의 column으로 groupby를 할 경우 index가 두 개 생성
- .unstack() : Group으로 묶여진 데이터를 matrix형태로 바꿔줌
- .swaplevel() : index level을 변경할 수 있음
- operations : index level을 기준으로 기본 연산 수행 가능
- groupby에 의해 split된 상태를 추출 가능함
grouped = df.groupby('Team')
for name, group in grouped: # 튜플 형태로 그룹의 key, value가 추출됨
print(name)
print(group)
- 추출된 group정보는 세 가지 apply가 가능함
1) Aggregation : 요약된 통계정보를 추출해 줌
grouped.agg(sum)
import numpy as np
grouped.agg(np.mean)
grouped['Points'].agg([np.sum, np.mean, np.std])
2) Transformation : 해당 정보를 변환해줌
score = lambda x: (x.max())
grouped.transform(score)
# 단 max나 min처럼 series데이터에 적용되는 데이터들은 Key값을 기준으로 Grouped된 데이터 기준
3) Filtration : 특정 정보를 제거 하여 보여주는 필터링 기능
df.groupby('Team').filter(lambda x:len(x)>=3)
# filter 안에는 boolean 조건이 존재해야 함
# len(x)는 grouped된 dataframe 개수
8. Pivot table & Crosstab
- excel에서 보던 그 것
- index 축은 groupby와 동일함
- Column에 추가로 labeling 값을 추가하여
- Value에 numeric type값을 aggregation하는 형태
* Pivot Table
df_phone.pivot_table(['duration'],index=[df_phone.mouth, df_phone.item],columns = df_phone.network, aggfunc='sum', fill_value= 0)
* Crosstab
- 특허 두 칼럼에 교차 빈도, 비율, 덧셈 등을 구할 때 사용
- Pivot table의 특수한 형태
- User-Item Rating Matrix 등을 만들 때 사용 가능함
df_movie = pd.read_csv('afds.csv')
df_movie.head() # 영화 이름, 평점을 보여주는 csv파일을 불러오기
pd.crosstab(index=df_movie.critic,columns=df_movie.title,values=df_movie.rating,aggfunc='first').fillna(0)
9. Merge & concat
* merge
- SQL에서 많이 사용하는 Merge와 같은 기능
- 두 개의 데이터를 하나로 합침
pd.merge(df_a,df_b,on='subject_id') # subject_id 기준으로 merge
pd.merge(df_a,df_b, left_on='subject_id', right_on='subject_id') # 두 dataframe의 column 이름이 다를 때
- join method
1) Inner join : 양쪽다 subject_id에 같은 값이 있을때
2) Full join : 같은 건 붙이고, 아닌건 각각 정리.
3) Left join : 왼쪽 값 기준.
4) Right join : 오른쪽 값 기준
pd.merge(df_a, df_b, on='subject_id', how='left') # left join
# how의 기본 값은 'inner' : inner join
# 'outer', 'right'
* concat
- 같은 형태의 데이터를 붙이는 연산작업
df_new = pd.concat([df_a, df_b])
df_new.reset_index()
df_a.append(df_b)
df_new = pd.concat([df_a,df_b],axis=1)
df_new.reset_index()