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

+ Recent posts