Pivot Table
데이터를 원하는 형태로 집계할 때 유용하게 사용할 수 있는 방법
데이터를 재정렬
https://pandas.pydata.org/docs/reference/api/pandas.pivot_table.html
pandas.pivot_table( 데이터, index=[' 컬럼명 '], columns=[' 컬럼명 ']
, values=[' 컬럼명 '], aggfunc=' 집계함수 ')
pandas.pivot_table( 데이터, index=[' 컬럼명 '], columns=[' 컬럼명 ']
, values=[' 컬럼명 '], aggfunc=' 집계함수 '
, fill_value=None
, margins=False
, dropna=True
, margins_name='All'
, observed=False
, sort=True)
- index = 각 행(row)는 무엇으로 정의할지
- columns = 각 열(column)은 무엇으로 정의할지
- values = 각 Cell을 어떤 숫자로 계산할지
- aggfunc = 집계함수, 계산을 어떻게 할지, 하나를 사용할수도 여러개 사용할 수도 있음.(리스트 또는 딕셔너리로...)
* 평균 : (기본값) aggfunc = np.mean()
* 합계 : aggfunc = np.sum()
* 표준편차 : aggfunc = 'std'
* count : aggfunc = 'count'
* 길이 : aggfunc = 'len'
* 고유값 count : aggfunc = 'nunique'
* 최대값 : aggfunc = np.max() 또는 'max'
* 최소값 : aggfunc = np.min() 또는 'min'
- fill_value = 기본값 None, 집계후 결과 피벗테이블에서 NaN 값을 대체할 값
- margins = 기본값 False, 맨아래 하단에 총계(All) 추가
- dropna = 기본값 True, 항목이 모두 NaN인 열은 포함하지 않고 생략한다.
- margins_name = 기본값 'All'
- observed = 기본값 False, 범주형인 경우에만 적용됨, Ture-관찰된 값만 표시, False-모든 값 표시
- sort = 기본값 True, 결과값을 정렬해야하는지 여부
import pandas as pd
df = pd.read_excel('경로~.xlsx')
df.head()
-- 출력 --
index 를 설정하여 데이터 재정렬
p_df1 = pd.pivot_table(df, index='Name')
# 위와 동일한 결과가 나옴
# p_df1 = df.pivot_table(index='Name')
print(p_df1)
-- 출력 --
p_df2 = df.pivot_table(index=['Name', 'Rep', 'Manager'])
print(p_df2)
-- 출력 --
values 로 집계될 데이터 지정
# 숫자형 컬럼들중에서 원하는 컬럼만 표시하고 싶다면, values로 지정하면 된다.
p_df3 = df.pivot_table(index=['Manager', 'Rep'], values='Price')
print(p_df3)
-- 출력 --
aggfunc 로 values에 적용할 집계함수 설정 (기본값: 평균)
p_df4 = df.pivot_table(index=['Manager', 'Rep'], values='Price', aggfunc=np.sum)
print(p_df4)
-- 출력 --
p_df5 = df.pivot_table(index=['Manager', 'Rep'], values='Price', aggfunc=[np.sum, len])
print(p_df5)
-- 출력 --
columns 로 분류 지정
p_df6 = df.pivot_table(index=['Manager', 'Rep'], values='Price', columns='Product', aggfunc=np.sum)
print(p_df6)
-- 출력 --
fill_value 로 NaN의 대체값 지정
p_df7 = df.pivot_table(index=['Manager', 'Rep'], values='Price',
columns='Product', aggfunc=np.sum, fill_value=0)
print(p_df7)
-- 출력 --
p_df8 = df.pivot_table(index=['Manager', 'Rep','Product'], values=['Price', 'Quantity'],
aggfunc=np.sum, fill_value=0)
print(p_df8)
-- 출력 --
margins 를 True 설정하면, 총계 행(ALL) 추가
p_df9 = df.pivot_table(
index=['Manager', 'Rep','Product'],
values=['Price', 'Quantity'],
aggfunc=[np.sum, np.mean],
fill_value=0,
margins=True) #총계 추가
print(p_df9)
-- 출력 --
Query문을 활용한 Pivot Table
Query문 : 원하는 조건의 데이터만 가져오는 명령어
데이터프레임변수명.query(' 컬럼명 == 조건문 ').pivot_table( )