pivot_table
groupby와 비슷하게 그룹분석을 하되 pivot table을 반환한다.
pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
data: 분석할 데이터프레임 (메서드일 때는 필요하지 않음)
values: 데이터프레임에서 분석할 열
index: 행 인덱스로 들어갈 키 열 또는 키 열의 리스트
columns: 열 인덱스로 들어갈 키 열 또는 키 열의 리스트
aggfunc: 분석 메서드
fill_value: NaN 대체 값
margins: 모든 데이터를 분석한 결과를 오른쪽과 아래에 붙일지 여부
margins_name: 마진 열(행)의 이름
조건에 따른 데이터가 유일하지 않으면 aggfunc으로 전달된 함수로 그룹연산하여 그룹의 대표값을 계산한다.
data = {
"도시": ["서울", "서울", "서울", "부산", "부산", "부산", "인천", "인천"],
"연도": ["2015", "2010", "2005", "2015", "2010", "2005", "2015", "2010"],
"인구": [9904312, 9631482, 9762546, 3448737, 3393191, 3512547, 2890451, 263203],
"지역": ["수도권", "수도권", "수도권", "경상권", "경상권", "경상권", "수도권", "수도권"]
}
columns = ["도시", "연도", "인구", "지역"]
df1 = pd.DataFrame(data, columns=columns)
df1.pivot_table(index='도시', columns='연도', values='인구')
# 실행 결과
도시 연도 인구 지역
0 서울 2015 9904312 수도권
1 서울 2010 9631482 수도권
2 서울 2005 9762546 수도권
3 부산 2015 3448737 경상권
4 부산 2010 3393191 경상권
5 부산 2005 3512547 경상권
6 인천 2015 2890451 수도권
7 인천 2010 263203 수도권
연도 2005 2010 2015
도시
부산 3512547.0 3393191.0 3448737.0
서울 9762546.0 9631482.0 9904312.0
인천 NaN 263203.0 2890451.0
margins=True로 설정하면 aggfunc로 주어진 그룹연산을 각 열, 행, 그리고 전체 데이터에 적용한 결과를 함께 보여준다.
df1.pivot_table(index='도시', columns='연도', values='인구', margins=True, margins_name='평균')
# 실행 결과
연도 2005 2010 2015 평균
도시
부산 3512547.0 3393191.0 3448737.0 3.451492e+06
서울 9762546.0 9631482.0 9904312.0 9.766113e+06
인천 NaN 263203.0 2890451.0 1.576827e+06
평균 6637546.5 4429292.0 5414500.0 5.350809e+06
행 인덱스나 열 인덱스에 리스트를 전달하면 다중 인덱스 테이블을 생성한다.
df1.pivot_table(index=["연도", "도시"], values="인구")
# 실행 결과
인구
연도 도시
2005 부산 3512547
서울 9762546
2010 부산 3393191
서울 9631482
인천 263203
2015 부산 3448737
서울 9904312
인천 2890451
참고 문서
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html