[AI] 03. Pandas 기초
DataFrame
2차원(col, row) 테이블 데이터 구조를 가진 자료형
1. 생성 방법
개인적인 메모 : JupyterLab에서 shift+enter 할 시 셀 실행
# pandas import
import pandas as pd
import numpy as np
1. 딕셔너리 활용
- pandas.DataFrame(딕셔너리) 함수 사용
2. 리스트 활용
- pandas.DataFrame(리스트) 함수 사용
3. 파일(csv 등) 활용
- 판다스로 먼저 import
- DataFrame명 = pandas.read_csv(파라미터)
- filepath & buffer : 파일경로/파일이름.csv
- sep & delimiter : 초기값은 ,(comma)
- encoding : utf8, cp949 etc
- indexcols : index로 사용할 column 설정
- usecols : index_col 포함
- 특정 변수에 제대로 데이터가 들어갔는지 확인하기 위해서 사용
DataFrame명.head(n=10) : (상위 10개)
DataFrame명.tail(n=5) : (하위 5개)
DataFrame 기본함수
- DataFrame명.shape : row, col 개수 튜플로 반환
- DataFrame명.columns : 컬럼명 확인
- DataFrame명.info : 데이터타입, 아이템 개수 출력
- DataFrame명.describe : 데이터 요약 통계량
- DataFrame명.dtype : 데이터 형태 종류
기타 함수
- numpy.arange(a, b) a부터 b-1에서 끝나도록 간격을 1로 반환하는 함수
- sort_values(by=’column’, ascending=False) 특정 column을 기준으로 sort. False는 내림차순, True는 오름차순이다.
데이터 조회
1. DataFrame에서 [] 형태로 column 선택 (복수선택 가능)
- Series 형태 DataFrame명.[‘column’]
- DataFraem 형태 DataFrame명.[[‘column’]]
2. DafaTrame Slicing으로 row 선택
- DataFrame명.loc : 이름, 라벨 기준으로 슬라이싱, 인덱싱
- DataFrame명.iloc : 행번호 기준으로 슬라이싱, 인덱싱 (0부터 시작하는 인덱스)
- bolean selection 연산으로 row 선택
3. DataFrame column 추가, 삭제
- DataFrame명.insert(loc, column, value, allow_duplicates=False) : 함수 삽입
- DataFrame명.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=’raise’) : 함수 삭제
- 이때 다른 데이터 프레임에 저장하거나 drop 함수 작성 시 inplace=True를 해야 원본 데이터가 지워진다.
2. 변형 방법
Group by (그룹화)
같은 값을 하나로 묶어서 통계 또는 집계 결과를 얻기 위해 사용하는 것, dictionary 형태
- 데이터분할(split)
- 적용(applying)
- 데이터병합(combine)
pivot, pivot table
col와 row를 중심으로 DataFrame 형태 변경하는 것으로 여러 분류로 섞인 행 데이터를 열 데이터로 회전한다.
- pivot table : aggrefucntion 함수 활용 pivot 테이블만 가능안 케이스
- Index가 2개 이상인 경우
- columns가 2개 이상인 경우
- 중복 값이 있는 경우
stack, unstack
- stack : 컬럼 레벨에서 인덱스 레벨로 DataFrame 변경
위에서 아래로 쌓는 개념 - unstack : 인덱스 레벨에서 컬럼 레벨로 변경
쌓은 것을 옆으로 늘어 놓는 개념
그룹화 단계
1. groupby, groups
- Groupby -DataFrame명.groupby(‘col’)
파라미터 : col의 리스트&col
dataframe 객체로 출력 - groupby명.groups : 그룹 속성 확인
GP = data.groupby('gender')
2. 함수 할용
- groupby명.count() : 데이터 개수
- groupby명.mean() : 집단별 크기
groupby명.std() : 표준편차
groupby명.var() : 분산 - groupby명.sum() : 데이터의 합
- groupby명.max() : 데이터의 max값
groupby명.min() : min값
3.groupby로 이용한 인덱스 설정 후 데이터 추출
GP.mean()[['score']] #1
data('gender').mean()[['score']]) #2
# 두 코드는 모두 같은 결과를 부른다.
- 이전에 data라는 데이터프레임의 col ‘gender’로 그룹화된 GP 중 특정 col ‘score’ 평균을 성별별로 출력한다.
- data라는 데이터프레임의 col ‘gender’ 중 특정 col ‘score’ 평균을 성별별로 출력한다. (이때 그룹화는 안된 상태)
4.복수 columns를 기준으로 Groupping
data.groupby(['department', 'gender']).mean()[['score']] #1
GP = data.groupby(['department', 'gender']) #1
GP.mean()[['score']] #1
data.groupby(['department', 'gender']).mean().loc[[("economic", "M")]] #2
- department, gender를 인덱스로 정한 후 score 평균을 구한다.
- department, gender로 그룹화된 데이터프레임의 라벨 중 economic, M에 관한 정보를 loc 함수로 구한다.
5~6. index를 이용한 그룹화 & MultiIndex를 이용한 groupping
data.set_index(['department','gender']).groupby(level=[0, 1]).mean()
-
DataFrame명.set_index([‘col1’, ‘col2’…])
- column 데이터를 인덱스 레벨로 변경하여 사용
- 기존의 행 인덱스 제거 및 데이터 열 중 하나를 인덱스로 설정
-
.groupby(level=[i])
- level : index의 depth, 가장 왼쪽을 0으로 취급하여 증가
- department, gender를 인덱스 레벨로 변경한 후 groupby 함수의 level[0,1 ]으로 통해 index depth가 0인 department와 1인 gender를 각각 순서대로 평균값(mean) 출력
-
reset_index 함수
- 인덱스 초기화
- 기존의 행 인덱스를 제거하고 인덱스를 데이터열로 추가
7. aggregate(집계) 함수 사용
data.set_index(['department','gender']).groupby(level=[0, 1]).aggregate([numpy.mean, numpy.max])
aggregate 함수 : 그룹별 mean, max 등 데이터 확인
pivot(table) 단계
1. pivot
data.pivot(index='인덱스명', columns='열', values='가치')
data.pivot('인덱스명', '열', '가치')
2. pivottable
data.pivot_table(index='인덱스명', columns='열', values='가치')
data.pivot_table(index='인덱스명', columns='열', values='가치', aggfunc=numpy.sum)
aggfunc = aggregate 함수
3. 차이점
# 에러
data.pivot(index=['인덱스1, 인덱스2'], columns='열', values='가치')
data.pivot(index='인덱스명', columns=['열1', '열2'], values='가치')
data.pivot(index='인덱스명', columns='열', values='가치') #중복값 포함
#정상작동
data.pivot_table(index=['인덱스1, 인덱스2'], columns='열', values='가치')
data.pivot_table(index='인덱스명', columns=['열1', '열2'], values='가치')
data.pivot_table(index='인덱스명', columns='열', values='가치') #중복값 포함
(un)stack 단계
stack : 컬럼 레벨에서 인덱스 레벨로 DataFrame 변경
unstack : 인덱스 레벨에서 컬럼 레벨로 변경
즉, 해당 단계에서는 컬럼 레벨↔인덱스 레벨 과정이 필요하기 때문에 set_index 함수로 데이터프레임 변경
DF = data.set_index(['department', 'gender']) #1
DF.unstack(0) #2
- department와 gender라는 col을 index로 변경
- 인덱스레벨(깊이)이 0인 department를 col로 이동
DF.unstack(0).stack(0) #1-1~1-2
DF.unstack(0).stack(1) #2
1-1. unstack(0)
인덱스레벨(깊이)아 0인 department를 col로 이동
1-2. .stack(0)
0번째 레벨 col을 인덱스로 이동(1번째 레벨 col은 department다)
2-1. .stack(1)
1번째 레벨 col을 인덱스로 이동(1번째 레벨 col은 department다) 따라서 department는 다시 인덱스로 이동하면서 바뀐다.
3. 병합 방법
concat/merge 함수
두개 이상의 DataFrame을 하나로 합치는 경우
- concat 함수 : 데이터 속성이 동일한 데이터 set
- merge 함수 : 두 DataFrame을 공통된 항목
inner, left, right, outer
concat 함수
데이터 속성 형태가 동일한 데이터 set끼리 합칠 때, 열·행 레벨로 병합
# column명이 같을 경우
pandas.concat([Data1명, Data2명], ignore_index=True) #1
pandas.concat([Data1명, Data2명], axis = 0) #2
pandas.concat([Data1명, Data2명], axis = 1) #2
-
ignore_index
- 기존 Index를 무시하고 재배열할 경우 True
- 그대로 유지할 경우 False 로 한다. (default)
데이터프레임1 인덱스(0~4), 데이터프레임2 인덱스 (1~6)일 경우
True : 0 1 2 3 4 5 6
False : 0 1 2 3 4 1 2 3 4 5 6
-
axis
- axis = 0은 row레벨로 위 아래로 합친다.
- aixs = 1은 col레벨로 왼쪽 오른쪽으로 합친다.
데이터프레임1의 column명이 key, value. 데이터프레임2의 column명이 key, value. axis = 0 : key, value로 출력
axis = 1 : key, value, key, value로 출력
pandas.concat([Data1명, Data2명], join='outer') #1
pandas.concat([Data1명, Data2명], join='inner') #1
-
join 함수
- outer는 합집합, inner는 교집합. column 기준.
데이터프레임1의 column:a b c, index:0 1 2 3
데이터프레임2의 column:a b c d, index:1 2 3 4
outer : column:a b c d, index: 0 1 2 3 1 2 3 4
inner : column:a b c, index: 0 1 2 3 1 2 3 4
pandas.concat([Data1명, Data2명], verify_integrity=False) #1
pandas.concat([Data1명, Data2명], verify_integrity=True) #1
-
verify_integrity
- True는 중복된 인덱스가 있을 경우 error발생
- False는 default임으로 중복된 인덱스가 있어도 error가 발생하지 않는다.
데이터프레임1의 index:0 1 2
데이터프레임2의 index:2 3 4
True : 에러발생
False : index 0 1 2 2 3 4
merge 함수
특정 column(key)를 기준으로 병합
join : 특정 col을 바탕으로 한다
-inner(default), left, right, outer
# 사람 정보를 가리키는 데이터프레임1 column: id, name, age
# 사람 정보를 가리키는 데이터프레임2 column: id, item, quantity
pandas.merge(Data1, Data2, on = 'id') #1
pandas.merge(Data1, Data2, on = 'id', how = 'inner') #1
pandas.merge(Data1, Data2, on = 'id', how = 'left') #2
pandas.merge(Data1, Data2, on = 'id', how = 'right') #3
pandas.merge(Data1, Data2, on = 'id', how = 'outer') #4
-
inner
- 디폴트로 사용되는 방법.
- 일치하는 값이 있는 경우, Merge할 테이블의 데이터가 모두 있는 경우만 가지고 온다
‘id’라는 명칭의 column을 기준으로 본다.
사람 정보를 가리키는 데이터프레임1 id 0 1 2 3 4
물건 정보를 가리키는 데이터프레임2 id 1 2 3 3 2 8
inner = 1 2 2 3 3 (0, 4, 8 제외)
-
left
- left outer join, 왼쪽을 기준으로 오른쪽을 채운다.
- 오른쪽값이 없을 경우 NaN 표시
‘id’라는 명칭의 column을 기준으로 본다.
사람 정보를 가리키는 데이터프레임1 id 0 1 2 3 4
물건 정보를 가리키는 데이터프레임2 id 1 2 3 3 2 8
DF1을 기준으로 DF2를 채운다.
left = 0 1 2 2 3 3 4 (DF1을 기준으로 0, 4 포함, 8 제외)
column = (id, name, age, item, quantity) 중 id 0과 4에 해당하는 사람은 item, quantity에서 NaN 표시됨
-
right
- right outer join, 오른쪽을 기준으로 왼쪽을 채운다.
- 왼쪽값이 없을 경우 NaN 표시
‘id’라는 명칭의 column을 기준으로 본다.
사람 정보를 가리키는 데이터프레임1 id 0 1 2 3 4
물건 정보를 가리키는 데이터프레임2 id 1 2 3 3 2 8
DF2를 기준으로 DF1을 채운다.
right = 1 2 2 3 3 8 (DF2을 기준으로 8 포함, 0, 4 제외)
column = (id, name, age, item, quantity) 중 id 8에 해당하는 사람은 name, age에서 NaN 표시됨
-
outer
- full outer join, left와 right를 합한 것이다.
‘id’라는 명칭의 column을 기준으로 본다.
사람 정보를 가리키는 데이터프레임1 id 0 1 2 3 4
물건 정보를 가리키는 데이터프레임2 id 1 2 3 3 2 8
outer = 0 1 2 2 3 3 4 8 (전부 포함)
column = (id, name, age, item, quantity) 중 id 8에 해당하는 사람은 name, age에서 NaN 표시됨
column = (id, name, age, item, quantity) 중 id 0과 4에 해당하는 사람은 item, quantity에서 NaN 표시됨
DF1 = Data1.set_index('id') #1
DF2 = Data2.set_index('id') #1
pandas.merge(DF1, DF2, left_index=True, right_index=True) #2
- set_index 함수로 이용해 ‘id’ column을 중심으로 새로운 데이터프레임을 만든다. 해당 함수로 통해 컬럼 레벨↔인덱스 레벨 과정을 한다.
- inner와 동일한 형태로 나온다.
DF1.join(DF2, how='left') #left는 defalt
-
join(데이터프레임, how=’’)
- set_index로 변형한 데이터프레임 활용
- 행 인덱스를 기준으로 결합한다.