이번 포스팅에서는 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 함수에 대해서 알아 보았습니다.
감사합니다!