python/pandas 활용

pandas - pivot, pivot_table

Memory! 2022. 4. 20. 00:32
728x90
반응형

- pandas의 DataFrame pivot하여 데이터 정렬하기

- pivot 기능은 테이블형태의 새로로 key, value 로 되어있는 데이터를 가로로 나열하는 형태입니다.

말로하면 어려우니 테이블 형태와 코드로 알아보겠습니다.

 

- 개발 환경 jupyter

 

- 테이블 만들기 

import pandas as pd
data = {'name':['홍길동','홍길동','홍길동','아무개','아무개','아무개'],
        'col_name':['age','sex','address','age','sex','address'],
        'value':[30,'male','seoul',22,'female','busan']}
data_df = pd.DataFrame(data)
data_df
  name col_name value
0 홍길동 age 30
1 홍길동 sex male
2 홍길동 address seoul
3 아무개 age 22
4 아무개 sex female
5 아무개 address busan

- pivot 함수로 pivot하기

data_df.pivot(index='name', columns='col_name', values = 'value')
col_name age sex
name    
busan 22 female
seoul 30 male

- pivot_table 함수로 pivot 하기

pd.pivot_table(data_df, index='name', columns='col_name', values = 'value', aggfunc='sum')

- pivot_table의 경우 aggfunc을 지정해주어야 합니다. 

- aggfunc는 pivot의 기준이 되는 column의 값이 두개 이상인 경우 어떻게 처리할지에 대한 function이라고 생각하시면 됩니다.

- 위와 같은 데이터의 경우에는 aggfunc는 아무 동작 하지 않습니다. (현재 코드에는 sum이죠..? 동작하지 않습니다.)

 

아래 예시로 확인하겠습니다.

data = {'name':['홍길동','홍길동','홍길동','아무개','아무개','아무개','아무개'],
        'col_name':['age','sex','address','age','sex','address','age'],
        'value':[30,'male','seoul',22,'female','busan',30]}
data_df = pd.DataFrame(data)
  name col_name value
0 홍길동 age 30
1 홍길동 sex male
2 홍길동 address seoul
3 아무개 age 22
4 아무개 sex female
5 아무개 address busan
6 아무개 age 30

동일한 name의 동일한 col_name에 value만 다른 값이 존재합니다.

이 경우 pivot() 함수를 사용하면 아래와 같은 에러가 납니다. ( 대충.. 중복 값이 있다는 얘기죠..)

ValueError: Index contains duplicate entries, cannot reshape

이럴 때 저 중복 값을 어떻게 처리할지를 aggfunc를 통해서 결정하게 됩니다.

pd.pivot_table(data_df, index='name', columns='col_name', values = 'value', aggfunc='sum')

이렇게 pivot을 하면?

col_name age sex
name    
busan 52 female
seoul 30 male

위와 같이 sum이 동작되어서 22+30으로 pivot된 것을 볼 수 있습니다.

pd.pivot_table(data_df, index='name', columns='col_name', values = 'value', aggfunc='max')
col_name age sex
name    
busan 30 female
seoul 30 male

22와 30중 큰값이 보이죠? 이렇게 활용이 가능합니다.

 

감사합니다!

728x90
반응형