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
반응형