[Python Pandas] pivot_table (피봇 테이블) 이해하기

이번 포스팅에서는 Python Pandas 라이브러리에서 제공하는 pivot_table (피봇 테이블) 에 대해서 알아 보겠습니다. pivot_table은 엑셀의 피봇 기능과 매우 유사한 결과물을 제공해 주는 함수입니다.

기본적인 구문에 대한 이해와 사용 예시를 살펴 보겠습니다.

pivot_table 구문

pivot_table 구문은 아래와 같고,


pandas.pivot_table(data
values = None
index = None
columns = None
aggfunc = ‘mean’
fill_value = None
margins=False
dropna=True
margins_name=’All’
observed=False
sort=True)


반환 값은 엑셀 스타일의 피봇 테이블 (DataFrame) 입니다.


pivot_table 인수

  • data : 피봇 테이블을 생성할 원천 DataFrame을 입력합니다.


  • values : list-like or scalar, optional
    • 집계할 열(들)을 입력합니다.


  • index : column, Grouper, array, or list of the previous
    • 피벗 테이블 인덱스에서 그룹화할 키입니다. 리스트 형식으로 전달하면 다른 유형(리스 제외)이 포함될 수 있습니다. 배열이 전달되면 데이터와 길이가 같아야 하며 열 값과 동일한 방식으로 사용됩니다.


  • columns : column, Grouper, array 또는 list
    • 피벗 테이블 열에서 그룹화 할 키입니다. 리스트가 전달되면 다른 유형(리스트 제외)이 포함될 수 있습니다. array가 전달되면 데이터와 길이가 동일해야 하며 열 값과 동일한 방식으로 사용됩니다.


  • aggfunc : function, list of functions, dict, default “mean”
    • 함수 리스트가 전달되면 결과 피벗 테이블에는 최상위 수준이 함수 이름인 계층적 열이 포함됩니다. 딕셔너리가 전달되면 key는 집계할 열이고, value는 함수 또는 함수 리스트입니다. margin = True인 경우 aggfunc를 사용하여 부분 집계를 계산합니다.


  • fill_value : scalar, default None
    • 집계 후 결과 피벗 테이블에서 누락된 값을 대체할 값입니다.


  • margins : bool, default False
    • margins = True인 경우 특수 모든 열과 행이 행과 열의 범주 전체에서 차지하는 비율을 함께 추가합니다.


  • dropna : bool, default True
    • 항목이 모두 NaN인 열을 제거합니다. True인 경우 마진을 계산하기 전에 모든 열에 NaN 값이 있는 행을 생략합니다.


  • margins_name : str, default ‘All’
    • margins가 True인 경우 합계가 포함될 행/열의 이름입니다.


  • observed : bool, default False
    • 이는 그룹화 중 하나라도 범주형인 경우에만 적용됩니다.
      True인 경우, 범주형 그룹화에 대해 실제 관찰된 값만 표시합니다.
      False인 경우, 범주형 그룹화 항목의 모든 값을 표시합니다.


  • sort : bool, default True
    • 결과의 정렬 여부를 지정합니다.



pivot_table 사용 예시

함수 사용 예시를 위한 임시 데이터 생성

import pandas as pd

tedmpData = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo","bar", "bar", "bar", "bar"],
                          "B": ["one", "one", "one", "two", "two", "one", "one", "two", "two"],
                          "C": ["small", "large", "large", "small", "small", "large", "small", "small", "large"],
                          "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
                          "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})

tedmpData
---------------------------------------------------------------------------------------------------------------------------
	A	B	C		D	E
0	foo	one	small	1	2
1	foo	one	large	2	4
2	foo	one	large	2	5
3	foo	two	small	3	5
4	foo	two	small	3	6
5	bar	one	large	4	6
6	bar	one	small	5	8
7	bar	two	small	6	9
8	bar	two	large	7	9


범주형 데이터에 대한 빈도 분석

A열의 범주별로 B열의 범주가 얼마나 존재하는 지 빈도 분석을 위한 피벗 테이블은 아래와 같습니다.

pd.pivot_table(data = tedmpData[['A','B']], 
               index = 'A', 
               columns = ['B'], 
               aggfunc = len)
--------------------------------------
B	one	two
A		
bar	2	2
foo	3	2

각 열과 행의 합을 구하여 피벗 테이블을 산출하려면 어떻게 해야 할까요? margins 인수를 사용하면 됩니다.


각 행과 열의 합을 피벗 테이블에 추가하려면?

pd.pivot_table(data = tedmpData[['A','B']], 
               index = 'A', 
               columns = ['B'], 
               aggfunc = len, 
               margins = True)
---------------------------------------
	B	one	two	All
A			
bar		2	2	4
foo		3	2	5
All		5	4	9

margins 결과 열 이름이 ‘ALL’로 생성되었습니다. 여기에 새로운 이름을 부여하겠습니다.


margins 열에 새로운 이름을 부여하려면?

margins_name 인수를 사용합니다.

pd.pivot_table(data = tedmpData[['A','B']], 
               index = 'A', 
               columns = ['B'], 
               aggfunc = len, 
               margins = True, 
               margins_name = "Total" 
              )
------------------------------------------
	B	one	two	Total
A			
bar		2	2	4
foo		3	2	5
Total	5	4	9


합계를 구하여 값을 집계하려면?

pd.pivot_table(data = tedmpData, values = 'D', 
               index = ['A', 'B'], 
               columns = ['C'], 
               aggfunc = "sum")
-----------------------------------------------
	C	large	small
A	B		
bar	one	4.0		5.0
two		7.0		6.0
foo	one	4.0		1.0
two		NaN		6.0

위의 코드는 A열과 B열의 범주를 기준으로 C열의 각 범주에 대한 D 열의 합계를 계산한 피벗 테이블입니다. 결측치(NaN) 가 보이네요. 결측치를 0으로 채우고 싶습니다.


피벗 테이블 결과에 결측치를 0으로 대체하려면?

fill_value 인수를 사용하면 됩니다.

pd.pivot_table(data = tedmpData, values = 'D', 
               index = ['A', 'B'], 
               columns = ['C'], 
               aggfunc = "sum", 
               fill_value = 0)
---------------------------------------------
	C	large	small
A	B		
bar	one	4.0		5.0
two		7.0		6.0
foo	one	4.0		1.0
two		0		6.0


피벗 테이블 결과에 여려 열의 평균을 산출하려면?

aggfunc 인수에 딕셔너리를 사용하면 됩니다.

pd.pivot_table(data = tedmpData, 
               index = ['A', 'C'], 
               values = ['D', 'E'], 
               aggfunc = {'D': "mean", 'E': "mean"})
-----------------------------------------------------------
			D			E
A	C		
bar	large	5.500000	7.500000
	small	5.500000	8.500000
foo	large	2.000000	4.500000
	small	2.333333	4.333333


피벗 테이블 결과에 여려 열의 평균 이외의 집계값을 산출하려면?

pd.pivot_table(data = tedmpData, 
               index = ['A', 'C'], 
               values = ['D', 'E'],
               aggfunc = {'D': "mean",'E': ["min", "max", "mean"]})
---------------------------------------------------------------------------
			D			E
			mean		max	mean		min
A	C				
bar	large	5.500000	9	7.500000	6
	small	5.500000	9	8.500000	8
foo	large	2.000000	5	4.500000	4
	small	2.333333	6	4.333333	2

위의 코드는 A열과 C열의 각 범주를 그룹으로 하여 D열은 평균값, E열은 최대값, 평균값, 최소값을 산출한 피벗 테이블입니다.


이상으로 Python Pandas 라이브러리에서 데이터 분석 결과를 집계하는 pivot_table 함수에 대해서 알아 보았습니다.
감사합니다!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다