Post

[AI] 03. Pandas 기초

[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 형태

  1. 데이터분할(split)
  2. 적용(applying)
  3. 데이터병합(combine)

pivot, pivot table

col와 row를 중심으로 DataFrame 형태 변경하는 것으로 여러 분류로 섞인 행 데이터를 열 데이터로 회전한다.

  • pivot table : aggrefucntion 함수 활용 pivot 테이블만 가능안 케이스
    1. Index가 2개 이상인 경우
    2. columns가 2개 이상인 경우
    3. 중복 값이 있는 경우

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
# 두 코드는 모두 같은 결과를 부른다. 
  1. 이전에 data라는 데이터프레임의 col ‘gender’로 그룹화된 GP 중 특정 col ‘score’ 평균을 성별별로 출력한다.
  2. 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
  1. department, gender를 인덱스로 정한 후 score 평균을 구한다.
  2. department, gender로 그룹화된 데이터프레임의 라벨 중 economic, M에 관한 정보를 loc 함수로 구한다.

5~6. index를 이용한 그룹화 & MultiIndex를 이용한 groupping

data.set_index(['department','gender']).groupby(level=[0, 1]).mean()
  1. DataFrame명.set_index([‘col1’, ‘col2’…])
    • column 데이터를 인덱스 레벨로 변경하여 사용
    • 기존의 행 인덱스 제거 및 데이터 열 중 하나를 인덱스로 설정
  2. .groupby(level=[i])
    • level : index의 depth, 가장 왼쪽을 0으로 취급하여 증가
    • department, gender를 인덱스 레벨로 변경한 후 groupby 함수의 level[0,1 ]으로 통해 index depth가 0인 department와 1인 gender를 각각 순서대로 평균값(mean) 출력
  3. 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
  1. department와 gender라는 col을 index로 변경
  2. 인덱스레벨(깊이)이 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
  1. 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

  1. 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
  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
  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
  1. 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 제외)

  1. 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 표시됨

  1. 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 표시됨

  1. 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
  1. set_index 함수로 이용해 ‘id’ column을 중심으로 새로운 데이터프레임을 만든다. 해당 함수로 통해 컬럼 레벨↔인덱스 레벨 과정을 한다.
  2. inner와 동일한 형태로 나온다.

DF1.join(DF2, how='left') #left는 defalt
  1. join(데이터프레임, how=’’)
    • set_index로 변형한 데이터프레임 활용
    • 행 인덱스를 기준으로 결합한다.
This post is licensed under CC BY 4.0 by the author.