피벗 테이블 (Pivot Table)
쉽게 말하면 특정 열의 관점에서 다른 특정 열의 정보를 확인하고 싶을 때 사용한다. 예를 들어서 각 부서의 평균 연봉이라던가, 각 계절의 판매량 등을 확인하고 싶은데, 내가 원하는 정보로 데이터가 있는 것이 아니라 부서 칼럼이 있고, 연봉 칼럼이 있던가, 계절 칼럼이 있고, 판매량 칼럼이 있던가 해서 계산해야 할 때 사용 가능하다.
pivot_table
(참고링크)을 활용해서 계산한다. 주요한 매개변수는 당연히 있어야 할 data
, 인덱스가 될 행을 선택하는 index
, 집계할 열을 선택하는 values
, 피벗 테이블의 열로 사용할 columns
, 집계 함수인 aggfunc
이 있다.
data
는 말 그대로 데이터로 피벗 테이블을 생성할 원본 데이터프레임을 말한다.
values
는 쉽게 말하면 계산할 값이다. 예를 들어 각 부서의 평균 연봉을 확인하고 싶을 때 values
를 연봉으로 설정하면 된다. 리스트 형태로 여러 열을 받을 수 있다. 기본값은 None
으로 aggfunc
가 적용 가능한 모든 열을 사용한다.
index
는 말 그대로 인덱스로 사용할 열이다. 단일 열도 가능하고, 리스트를 통한 여러 열도 가능하다. 배열로 그룹핑하여 인덱스를 만드는 것도 가능한데, 이 경우 배열은 원본 데이터의 길이와 동일해야 한다.
columns
는 열을 선택하는 것으로 index
와 입력받는 것은 비슷하다. 지정하지 않는다면 values
와 동일하다.
aggfunc
은 집계 함수로 values
를 계산한다. 자주 사용하는 것으로는 'mean'
, 'sum'
, 'count'
, 'max'
, 'min'
등이 있다. 기본값은 'mean'
이다.
예를 통해 정리해보자. 성별에 따른 각 부서 평균 연봉을 알고 싶다 가정하자. 이 경우 성별이 columns
가 되고, 연봉이 values
가 되며, index
는 부서가 될 것이다. 평균 연봉이기 때문에 aggfunc
은 'mean'
이 될 것이다.
fil_value
매개변수는 NaN
값을 대체할 값을 지정하는 것으로 기본값은 None
이다.
margins
매개변수는 기본값이 False
인데, True
로 설정하면 전체 합계를 포함하는 행, 열을 추가한다.
dropna
는 모든 값이 NaN
인 칼럼을 제외하는 설정으로 기본값은 True
이다.
margins_name
은 margins
매개변수를 True
로 설정하였을 때 생기는 행, 열의 이름을 설정하는 것이다. 기본값은 'All'
이다.
observed
는 기룹화 기준이 범주형일 경우 적용되는데 True
라면 관찰된 값만 표시하고, False
라면 모든 범주 값을 표시한다. 기본값은 False
이나 2.2.0 버전부터는 기본값이 True
로 변경되었다.
sort
는 말 그대로 결과를 정렬하는 것으로 기본값은 True
이다.
예시
대략 아래와 같은 df
데이터프레임이 있다고 가정하자.
name gender age account balance bank membership duration
0 Alice Female 21 8992503 Hana Bank 1
1 Bob Male 35 7227778 Shinhan Bank 20
2 Charlie Male 55 1717715 KB Bank 10
3 David Male 60 5797641 Woori Bank 12
4 Eve Female 37 9370325 NH Bank 20
5 Frank Male 41 2989960 Hana Bank 6
6 Grace Female 54 4780278 Woori Bank 5
7 Hannah Female 41 6556791 Hana Bank 17
8 Ivy Female 31 1154215 NH Bank 15
9 Jack Male 30 9506940 Shinhan Bank 14
10 Kevin Male 44 9225578 KB Bank 2
11 Luna Female 22 4009180 Shinhan Bank 3
12 Mike Male 55 2294952 Woori Bank 1
13 Nancy Female 48 5149479 KB Bank 12
14 Oscar Male 48 6176913 Shinhan Bank 15
15 Paul Male 24 9622417 Hana Bank 3
16 Quinn Male 44 2221040 Hana Bank 12
17 Rachel Female 49 6788748 Woori Bank 19
18 Steve Male 55 8928420 Hana Bank 19
19 Tracy Female 26 8617524 KB Bank 15
20 Uma Female 22 750593 KB Bank 1
21 Victor Male 58 5723707 KB Bank 15
22 Wendy Female 48 7425002 Woori Bank 8
23 Xavier Male 53 6695489 NH Bank 15
24 Yvonne Female 53 6561448 NH Bank 13
25 Zach Male 59 3599520 Hana Bank 7
26 Amy Female 25 2936163 NH Bank 11
27 Brian Male 58 477639 Woori Bank 9
28 Clara Female 39 4215210 KB Bank 20
29 Derek Male 50 2814876 Shinhan Bank 1
이제 은행별 성별에 따른 연령, 계좌금액, 가입기간을 확인해보자. 다음과 같이 pivot_table
을 이용할 수 있다.
pivot_table(df, index='bank', columns='gender', values=['age', 'account balance', 'membership duration'])
결과를 확인해보면 다음과 같다.
account balance age membership duration
gender Female Male Female Male Female Male
bank
Hana Bank 7,774,647.00 5,472,271.40 31.00 44.60 9.00 9.40
KB Bank 4,683,201.50 5,555,666.67 33.75 52.33 12.00 9.00
NH Bank 5,005,537.75 6,695,489.00 36.50 53.00 14.75 15.00
Shinhan Bank 4,009,180.00 6,431,626.75 22.00 40.75 3.00 12.50
Woori Bank 6,331,342.67 2,856,744.00 50.33 57.67 10.67 7.33
'Data Science > Data Processing' 카테고리의 다른 글
[Pandas] 쿼리(query)를 이용한 데이터프레임 탐색 (0) | 2025.03.04 |
---|---|
[Pandas] 데이터프레임 그룹화(groupby) (0) | 2025.03.04 |
[Pandas] 데이터프레임 새로운 열 할당(assign) 및 구간 나눠(cut, qcut) 새로운 열 만들기 (0) | 2025.03.03 |
[Pandas] 데이터프레임 중복 행 제거(drop duplicates) 및 특정 행 또는 열 제거(drop) (0) | 2025.03.02 |
[Pandas] 데이터프레임 인덱싱(loc, iloc) 및 단일값 접근(at, iat) (0) | 2025.01.17 |