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
'파이썬완전정복-Pandas DataFrame > 09. 가공' 카테고리의 다른 글
Pandas DataFrame 09-12. 새 열 할당 (assign) (0) | 2022.01.24 |
---|---|
Pandas DataFrame 09-11. 피벗해제 (melt) (0) | 2022.01.23 |
Pandas DataFrame 09-09. 피벗변환 (pivot) (0) | 2022.01.23 |
Pandas DataFrame 09-08. 차원축소, 스칼라 변환 (squeeze) (0) | 2022.01.23 |
Pandas DataFrame 09-07. 중복행 제거 (drop_duplicates) (0) | 2022.01.23 |