Python/NumPy | Pandas

[Python] Pandas - 피봇테이블과 그룹분석 3

비번변경 2023. 1. 1. 17:32

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