중앙백 2021. 12. 7. 21:17

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