pandas
- 구조화 된 데이터 처리를 지원하는 라이브러리
- python계의 엑셀
- panel data - > pandas
- 고성능 array 계산 라이브러리인 numpy와 통합하여 강력한 '스프레드시트' 처리 기능을 제공
- 인덱싱, 연산용 함수, 전처리 함수 등을 제공함
- 데이터 처리 및 통계 분석을 위해 사용
데이터 로딩
- pd.read_csv: csv 읽어옴
- head(): 처음 다섯 행 출력
- columns: 컬럼 이름 지정
series
- DataFrame: 데이터 테이블 전체를 포함하는 object
- 데이터 프레임중 하나의 column에 해당하는 데이터의 모음 object
- 데이터, 인덱스로 구성됨
import pandas as pd
list_data = [1, 2, 3, 4, 5]
list_name = ['a', 'b', 'c', 'd', 'e']
sample_obj = pd.Series(data=list_data, index=list_name)
sample_obj['a'] # 인덱스로 접근하기
sample_obj['a'] = 3.2 # 인덱스로 할당하기
sample_obj.astype(int) # 타입 변경
sample_obj.values # 값 리스트만
sample_obj.index # 인덱스 리스트만
sample_obj.name # 컬럼 이름 지정
- 인덱스 값을 기준으로 series 생성, 인덱스가 데이터보다 많으면 NaN 추가
DataFrame
- 데이터 테이블 전체를 포함하는 object
- series를 모아서 만든 데이터 테이블 = 기본 2차원
raw_data = {'first_name':['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name':['Miller', 'Jaconbson', 'Ali', 'Milner', 'Cooze'],
'age':[42, 52, 36, 24, 73],
'city':['San Francisco', 'Baltimore', 'Douglas', 'Boston']}
df = pd.DataFrame(raw_data, colums = ['first_name', 'last_name', 'age', 'city'])
# column 선택 방법 - Serise 데이터
df.first_name
df['first_name']
DataFrame indexing
- loc[index, column]: 인덱스 이름으로 접근
- iloc: 숫자로 변형
DataFrame handling
df.debt = df.age > 40 #column에 새로운 값 할당
values = Serise(data=['M', 'F', 'F'], index=[0, 1, 3])
df['sex'] = values
df.T # transpose
df.values # array 타입으로 값 출력
df.to_csv() # csv형태로 출력
del df['debt'] # 컬럼 삭제
df.drop('debt', axis=1)
selection with column names
- 컬럼 하나: df['column']
- 컬럼 하나 이상: df[[column_1, column_2, column_3]]
selection with index number
- df[:1]
- 한 개 이상 인덱스: df[0, 1, 2]
- 불리언: df[column < 500]
basic, loc, iloc selection
- basic: df[['column_1', 'column_2']]
- loc: df.loc[1, 1]
- iloc: df.iloc[1, 1]
index 재설정
- df.index = list: 인덱스 할당
- df.reset_index(inplace=True): 인덱스 리셋, inplace - 원본 데이터를 변경함
data drop
- df.drop(index, inplace=True): 해당 인덱스 삭제
dataframe operation
serise operation
- index를 기준으로 연산 수행, 겹치는 index가 없을 경우 NaN 반환
- fill_value: NaN값 0으로 바꿔서 계산
series + dataframe
- axis를 기준으로 row broadcasting 실행
- df.add(s2, axis=0)
lambda, map, apply
- pandas의 series type에도 map 함수 사용 가능
- function 대신 dict, sequence 자료등으로 대체 가능
s1 = Series(np.arange(10))
s1.map(lambda x:x**2).head()
z = {1:'A', 2:'B', 3:'C'}
s1.map(z).head()
#dict type으로 데이터 교체
s2 = Series(np.arange(10, 20))
s1.map(s2).head(5)
#같은 위치의 데이터를 s2로 전환
apply for dataframe
- map과 달리 series 전체가 해당 함수에 들어감
- 입력 값이 series 데이터로 입력받아 handling 가능
- 내장 연산 함수를 사용할 때도 똑같은 효과를 거둘 수 있음
- mean, std, sum 등
- series 단위에 apply 적용시킬 때는 map과 같은 효과
applymap for dataframe
- series 단위가 아닌 element 단위로 함수를 적용함
pandas built-in function
describe
- numeric type 데이터의 요약 정보를 읽어줌
unique
- series data의 유일한 값을 list로 반환
sum
- 기본적인 column 또는 row 값의 연산을 지원
- sub, mean, min, max, count, median, mad, var 등
isnull
- column 또는 row값의 Nana 값의 인덱스를 반환함
- df.isnull().sum(): 널값이 몇갠지 보여줌
sort_values
- column 기준으로 데이터를 sorting
correlation & covariance
- 상관계수와 공분산을 구하는 함수
- corr(모든 column), cov, corrwith(특정 한 column)
- pd.option.display.max_rows: 디스플레이 행 수 늘리기
Groupby-1
- SQL groupby 명령어와 같음
- split -> apply -> combine 과정을 거쳐 연산함
df.groupby('Team')['Points'].sum()
- 한 개 이상의 column을 묶을 수 있음
df.groupby(['Team', 'Year'])['Points'].sum()
hierarchical index
- groupby 명령의 결과물도 dataframe
- 두개의 column으로 groupby를 할 경우, index가 두개 생성
- unstack(): 그룹으로 묶여진 데이터를 matrix 형태로 바꿔 줌
- swaplevel(): 인덱스 레벨을 바꿔 줌
- sort_index(level=0): 레벨을 기준으로 sort
- index level을 기준으로 기본 연산 수행 가능
Groupby-2
- groupby에 의해 split 된 상태를 추출 가능함
grouped = df.groupby('Team')
for name, group in grouped:
print(name)
print(group)
- tuple 형태로 그룹의 key, value 값이 추출 됨
- get_gorup(group_name): 특정 그룹의 정보를 가져올 수 있음
- 추출된 그룹 정보에는 세 가지 유형의 apply가 가능함
- Aggregation: 요약된 통계 정보를 추출해줌
- Transformation: 해당 정보를 변환해줌
- Filtration: 특정 정보를 제거하여 보여주는 필터링 기능
pivot table & crosstab
pivot table
- index 축은 groupby와 동일함
- column에 추가로 labeling 값을 추가하여
- value에 numeric type 값을 aggregation 하는 형태
df_phone.pivot_table(value=['duration'],
index=[df_phone.month, df_phone.item],
columns=df_phone.network,
aggfunc='sum',
fill_value=0)
# groupby로 구현
df_phone.groupby(['month', 'item', 'network'])['duration'].sum().unstack()
crosstab
- 두 칼럼의 교차 빈도, 비율, 덧셈등을 구할 때 사용
- pivot table의 특수한 형태
- user-item rating matrix등을 만들 때 사용
pd.crosstab(index=df_movie.critic,
columns=df_movie.title,
values=df_movie.rating,
aggfunc='first',
).fillna(0)
merge & concat
merge
- SQL에서 사용하는 merge와 같은 기능
- 두개의 데이터를 하나로 합침
pd.merge(df_a, df_b, on='subject_id')
pd.merge(df_a, df_b, left_on='subject_id', right_on='subject_id') # 두 dataframe의 column 이름이 다를 때
join method
- inner join: 양쪽 테이블에 같은 subject_id가 있어야 함
- left/right join: 어느 한 쪽을 기준으로 join, 없는 것은 NaN 처리
- full(outer) join: 같은 것은 join하고 다른 것은 NaN
index based join
pd.merge(df_a, df_b, right_index=True, left_index=True)
concat
- 같은 형태의 데이터를 붙이는 연산작업
pd.concat([df_a, df_b], axis=1)
- 예제) 날짜 별로 다른 파일에 저장이 되어 있을 때
import os
import pandas as pd
files = [file_name for file_name in os.listdir('./data') if file_name.endswith('xlsx')]
df_list = [pd.read_excel(os.path.join('data', df_filename) for df_filename in files)]
status = df_list[0]
sales = pd.concat(df_list[1:])
persistence
Database connection
- data loading시 db connection 기능 제공함
import sqlite3
conn = sqlite3.connect('./data/flights.db')
cur = conn.cursor()
cur.execute('select * from airlines limit 5;')
result = cur.fetchall()
result
df_airlines = pd.read_sql_query('select * from airlines;', conn)
df_airlines
XLS persistence
- dataframe의 엑셀 추출 코드
- xls 엔진으로 openpyxls 또는 XlsxWrite 사용
writer = pd.ExcelWriter('./data/df_routes.xlsx', engine='xlsxwriter')
df_routes.to_excel(writer, sheet_name='Sheet1')
출처: boostcamp precourse
'Python > Study' 카테고리의 다른 글
파이썬 알고리즘 인터뷰 - 배열 (0) | 2021.11.03 |
---|---|
파이썬 알고리즘 인터뷰 - 문자열 (0) | 2021.11.03 |
Basic Python) Numpy (0) | 2021.11.02 |
Basic Python) Data handling (0) | 2021.11.02 |
Basic Python) File / Exception / Log Handling (0) | 2021.11.02 |