반응형

09-10. 피벗생성_스프레드시트 기반 (pivot_table)

DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)

 

개요


pivot_table메서드는 데이터를 스프레드시트 기반 피벗 테이블로 변환하는 메서드입니다.
엑셀 스프레드시트 피벗 테이블과 유사한 기능을 합니다.

 

사용법


기본 사용법
df.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)
values : 값으로 입력될 열 입니다.
index : 인덱스로 사용될 열입니다.
columns : 열로 사용될 열 입니다.
aggfunc : 결과로 출력될 함수 입니다.
fill_value : 결측치를 채워넣을 값입니다.
margins : 합계를 표시할지 여부입니다. True일 경우 새 열을 생성하여 합계를 출력합니다.
dropna : 항목이 모두 결측치인 열을 포함할지 여부입니다. 기본값은 True로 포함하지 않습니다.
margins_name : margins가 True일 경우 해당 열의 이름입니다.
observed : 범주형 그룹에 대해 관찰된 값만 표시할지 여부 입니다.
sort : 각 범주들을 사전적으로 정리할지 여부입니다. 기본값은 True로 정렬이 수행됩니다.

반응형

 

예시


먼저, 아래와 같이 간단한 9x5 객체를 만들어 보겠습니다.

col = ['Machine','Country','Grade','Price','Count']
data = [['TV','Korea','A',1000,3],
        ['TV','Korea','B', 800,8],
        ['TV','Korea','B', 800,2],
        ['TV','Japan','A',1300,5],
        ['TV','Japan','A',1300,1],
        ['PC','Korea','B',1500,6],
        ['PC','Korea','A',2000,9],
        ['PC','Japan','A',3000,3],
        ['PC','Japan','B',2500,3]]
df = pd.DataFrame(data=data, columns=col)
print(df)
>>
  Machine Country Grade  Price  Count
0      TV   Korea     A   1000      3
1      TV   Korea     B    800      8
2      TV   Korea     B    800      2
3      TV   Japan     A   1300      5
4      TV   Japan     A   1300      1
5      PC   Korea     B   1500      6
6      PC   Korea     A   2000      9
7      PC   Japan     A   3000      3
8      PC   Japan     B   2500      3

기본적인 사용법
index를 Machine, Country로 하고 columns를 Grade로 설정하고 Count값들을 np.sum으로 합계를 계산하여 스프레드 시트로 출력해보겠습니다.

print(df.pivot_table(values='Count',index=['Machine','Country'],columns='Grade',aggfunc=np.sum))
>>
# sum값으로 출력됨.
Grade              A     B
Machine Country           
PC      Japan    3.0   3.0
        Korea    9.0   6.0
TV      Japan    6.0   NaN
        Korea    3.0  10.0


sort인수의 사용
결과는 기본적으로 사전적으로 정렬이 되어있습니다. PC와 TV, Japan과 Korea는 알파벳순서로 정렬되어있습니다.
sort를 False로하면 기존 입력 순서대로 출력이 됩니다.

print(df.pivot_table(values='Count',index=['Machine','Country'],columns='Grade',aggfunc=np.sum,sort=False))
>>
Grade              A     B
Machine Country           
TV      Korea    3.0  10.0
        Japan    6.0   NaN
PC      Korea    9.0   6.0
        Japan    3.0   3.0


여러 값에 대해 여러 함수 적용
엑셀의 피벗테이블과 유사하게 여러 값에 대해서 여러 값(values)에 대해 여러 함수(aggfunc)를 설정할 수 있습니다.

# list를 이용하여 다중 함수 적용이 가능합니다.
print(df.pivot_table(values=['Count','Price'],index=['Machine','Country'],columns='Grade',aggfunc=[np.sum,np.mean]))
>>
                  sum                        mean                     
                Count         Price         Count        Price        
Grade               A     B       A       B     A    B       A       B
Machine Country                                                       
PC      Japan     3.0   3.0  3000.0  2500.0   3.0  3.0  3000.0  2500.0
        Korea     9.0   6.0  2000.0  1500.0   9.0  6.0  2000.0  1500.0
TV      Japan     6.0   NaN  2600.0     NaN   3.0  NaN  1300.0     NaN
        Korea     3.0  10.0  1000.0  1600.0   3.0  5.0  1000.0   800.0

dict를 이용할 경우 각 값에 대해서 특정 함수의 적용이 가능합니다.

print(df.pivot_table(values=['Count','Price'],index=['Machine','Country'],columns='Grade',aggfunc={'Count':np.sum,'Price':np.mean}))
>>
                Count         Price        
Grade               A     B       A       B
Machine Country                            
PC      Japan     3.0   3.0  3000.0  2500.0
        Korea     9.0   6.0  2000.0  1500.0
TV      Japan     6.0   NaN  1300.0     NaN
        Korea     3.0  10.0  1000.0   800.0


fill_value를 이용한 결측치 제거
fill_value에 값을 입력하므로서 결측치를 해당 값으로 대체할 수 있습니다.

print(df.pivot_table(values='Count',index=['Machine','Country'],columns='Grade',aggfunc=np.sum,fill_value='누락'))
>>
Grade              A     B
Machine Country           
PC      Japan    3.0   3.0
        Korea    9.0   6.0
TV      Japan    6.0    누락
        Korea    3.0  10.0


fill_value를 이용한 결측치 제거
margines를 이용해서 총계를 출력할 수 있으며 margines_name을 이용해서 해당 레이블의 이름을 지정할 수 있습니다.

print(df.pivot_table(values='Count',index=['Machine','Country'],columns='Grade',aggfunc=np.sum,margins=True))
>>
Grade               A     B  All
Machine Country                 
PC      Japan     3.0   3.0    6
        Korea     9.0   6.0   15
TV      Japan     6.0   NaN    6
        Korea     3.0  10.0   13
All              21.0  19.0   40

All로 출력된 행/열의 이름을 변경해보겠습니다.

print(df.pivot_table(values='Count',index=['Machine','Country'],columns='Grade',aggfunc=np.sum,margins=True,margins_name='총계'))
>>
Grade               A     B  총계
Machine Country                
PC      Japan     3.0   3.0   6
        Korea     9.0   6.0  15
TV      Japan     6.0   NaN   6
        Korea     3.0  10.0  13
총계               21.0  19.0  40
반응형

+ 최근 글