Python/Pandas

[Pandas] 파이썬 피벗테이블 생성 : pd.pivot_table 함수 사용법 정리

jimmy_AI 2022. 4. 21. 21:47
반응형

파이썬 판다스 pivot_table 함수 사용 예제

파이썬 pandas 모듈의 pd.pivot_table 함수로 피벗테이블을 원하는대로 생성하는 방법을

values, index, columns, fill_value 및 aggfunc 인자의 기능을 위주로 정리해보겠습니다.

 

이 글은 판다스의 pd.pivot_table 함수 공식 설명 글의 내용에 기반하여 작성되었습니다.

 

먼저, 이해를 돕기 위하여 아래와 같이 학생들의 정보와 점수가 적혀있는 데이터프레임 df

있다고 가정해보도록 하겠습니다.

import pandas as pd
import numpy as np

a = {'반' : [1, 1, 1, 1, 2, 2, 2, 2], '성별' : ['남', '남', '여', '여', '남', '남', '여', '여'], '전공' : ['이과', '이과', '이과', '문과', '문과', '문과', '문과', '이과'],
     '국어' : [90, 80, 85, 95, 100, 85, 95, 90], '수학' : [88, 96, 92, 84, 80, 92, 88, 100]}
df = pd.DataFrame(a)
df

 

 

pd.pivot_table 함수 인자 종류, 의미

우선, 피벗테이블 생성 시 지정할 인자들의 종류와 각 인자의 의미를 정리하면 아래와 같습니다.

 

values : 피벗테이블에서 각 그룹 별로 조회할 값의 기존 데이터프레임의 열 이름(들)

index : 테이블의 행으로 들어갈 기존 데이터프레임의 열 이름(들)

columns : 테이블의 열로 들어갈 기존 데이터프레임의 열 이름(들)

fill_value : 값이 존재하지 않는 그룹에 채울 값 지정(기본 값 : np.NaN)

aggfunc : 각 그룹 별로 값들을 조회할 함수(들)

 

위의 5가지 인자 외에도 다양한 인자를 지원하지만, 여기서는 해당 5가지 인자를 기준으로

사용법을 말씀드려보도록 하겠습니다.

 

 

기본 피벗테이블 예시

가장 먼저, values, index, columns, aggfunc를 1가지씩만 지정한 기본적인 형태의

피벗테이블을 살펴보도록 하겠습니다.

 

전공을 기준으로 그룹을 나누어 각 그룹의 국어 성적 평균을 조회한 예시는 아래와 같습니다.

table1 = pd.pivot_table(df, values='국어', index=['반'],
                    columns=['전공'], aggfunc=np.mean)

table1

index로 지정한 반은 왼쪽에, columns로 지정한 전공은 위쪽에 들어있는 것을

확인해보실 수 있습니다.

 

 

values 여러개 지정 예시

이제, 위의 테이블에서 각 그룹별로 국어 성적뿐 아니라 수학 성적의 평균도 같이 조회하고

싶다고 가정해보겠습니다. 이 경우, values 인자를 아래처럼 리스트로 묶어서 지정하시면 됩니다.

table2 = pd.pivot_table(df, values=['국어', '수학'], index=['반'],
                    columns=['전공'], aggfunc=np.mean)

table2

국어 성적 옆에 수학 성적의 평균도 같이 조회된 모습 확인이 가능합니다.

반응형

index 여러개 지정 예시

이번에는 앞의 테이블에서 왼쪽 row에 위치할 index 인자를 여러개 지정해보겠습니다.

반과 전공뿐 아니라 성별 정보도 그룹의 기준에 추가하되,

성별 정보는 반 정보와 함께 왼쪽 row에 위치하게 만드는 예시입니다.

table3 = pd.pivot_table(df, values=['국어', '수학'], index=['반', '성별'],
                    columns=['전공'], aggfunc=np.mean)

table3

여기서 NaN으로 표시된 부분은 해당 그룹에 속하는 학생 정보가 없는 경우입니다.

예시로, 가장 위의 데이터프레임 df에서 1반, 문과, 남자에 속하는 학생은 찾을 수 없습니다.

 

 

columns 여러개 지정 예시

만일, 성별 정보를 왼쪽 row 대신 위쪽 column 위치에 추가하고 싶다면

columns 인자에 해당 정보를 포함하여 피벗테이블을 생성해주시면 됩니다.

table4 = pd.pivot_table(df, values=['국어', '수학'], index=['반'],
                    columns=['전공', '성별'], aggfunc=np.mean)

table4

마찬가지로, 학생 정보가 없는 그룹의 값은 NaN으로 표기되었습니다.

 

 

fill_value 지정 예시

만일, 학생 정보가 없는 그룹의 데이터를 NaN이 아닌 다른 값으로 채우고 싶다면

fill_value 인자에 대치를 원하는 값을 지정해주시면 됩니다.

 

여기서는 바로 위의 테이블에서 fill_value = 0으로 지정해본 결과를 확인해보겠습니다.

table5 = pd.pivot_table(df, values=['국어', '수학'], index=['반'],
                    columns=['전공', '성별'], aggfunc=np.mean, fill_value = 0)

table5

학생 정보가 없는 그룹의 값들이 NaN이 아닌 0으로 채워진 결과가 나타났습니다.

 

 

aggfunc 여러개 지정 예시

마지막으로, 각 그룹에서 조회하고 싶은 값 연산의 종류가 여러개인 경우,

aggfunc 인자에 원하는 연산 함수들을 리스트로 모아서 지정해주시면 됩니다.

 

예시로, 각 그룹별 국어 및 수학 성적의 평균뿐 아니라 표준편차 정보까지 얻고 싶다면

아래처럼 피벗테이블을 조회해주시면 됩니다.(성별 정보는 index로 포함시켰습니다.)

table6 = pd.pivot_table(df, values=['국어', '수학'], index=['반', '성별'],
                    columns=['전공'], aggfunc=[np.mean, np.std])

table6

소속 학생이 1명인 그룹의 경우 표준편차를 계산할 수 없어 NaN으로 출력된 점에 유의해주세요.