본문 바로가기
목차
Python/pandas

[Pandas] pivot_table() 메서드

by ds31x 2025. 8. 19.
728x90
반응형

https://www.pythoncentral.io/pandas-pivot-tables/

.pivot()과 같이 reshaping이 가능한 메서드.

  • 차이점은 .pivot()pivot 결과 테이블의 행-열 조합에서 중복되는 요소가 있는 경우 에러가 발생하나,
  • .pivot_table()aggregation을 통한 하나의 대표값으로 처리가 가능함.

groupby+aggregation+unstack 조합에
대한 일종의 syntactic sugar임.

2025.08.20 - [Python] - [Term] pivot 이란?

 

[Term] pivot 이란?

1. pivot 이란?Pandas에서 pivot은 데이터의 모양(shape)을 바꾸는 기능 을 가리킴: reshaping특정 column의 값들을 row 인덱스(index)로,또 다른 column의 값들을 열(columns)로지정하는 테이블을 만들고,해당 조합(

ds31x.tistory.com


Key ideas

  • pivot_table() = groupby + unstack의 편의 API
  • 행/열 축을 지정하고, 동일 셀에 다수 값이 있으면 aggfunc로 요약 (pivot()과의 차이)
  • 결측값 처리는 fill_value,
  • 총합/비율은 margins, margins_name으로 처리

기본 시그니처 (Signature)

DataFrame.pivot_table(
    values=None,
    index=None,
    columns=None,
    aggfunc='mean',
    fill_value=None,
    margins=False,
    margins_name='All',
    dropna=True,
    observed=False,
)
  • values: 집계(aggregation:aggfunc)할 대상 컬럼(하나 또는 여러 개)-index와 column의 조합에 해당하는 값!
    • 예: "GDP" 또는 ["GDP", "Population"]
  • index: 피벗 결과에서 행(Row) 인덱스로 사용할 컬럼
    • 예: "Country" 또는 ["Region", "Country"]
  • columns: 피벗 결과에서 열(Column)로 사용할 컬럼
    • 예: "Year"
  • aggfunc: 집계 함수, 기본값 "mean"
    • 예: "sum", "first", "max", len, 또는
    • 여러 개 집계 함수 : ["mean", "max"]
  • fill_value: NaN 값을 대체할 값.
    • 예: 0
  • margins:
    • True인 경우, 행/열에 합계(All) 추가
  • margins_name:
    • 추가된 합계 행/열 이름 (기본 "All")
  • dropna: True면 모든 값이 NaN인 열 레벨 제거
  • observed: 범주형 변수 사용 시 관측된 조합만 표시할지 여부
    • False 가 기본값으로 관측되지 않은 조합도 표시됨.

When to use

  • 동일 (index, columns) 조합에 중복 row가 존재하는 raw data aggregation 필요할 때
  • groupby(...).agg(...).unstack(...)를 간결하게 쓰고 싶을 때
  • 피벗 결과에 total(합계)이나 NaN 대체가 필요할 때

예제 1: 기본 집계 (mean)

국가-연도별 측정값을 피벗해

국가를 row(행), 연도를 column(열)로 배치하고

mean(평균)으로 집계하는 예제임.

import pandas as pd

# 샘플 데이터 생성
df = pd.DataFrame({
    "country": ["Korea", "Korea", "USA", "USA", "USA"],
    "year":    [2020, 2020, 2020, 2020, 2021],
    "value":   [30, 32, 50, 52, 55],
})

# pivot_table 사용: 국가-연도별 평균 계산
pt = df.pivot_table(
    index="country",   # 행 인덱스: 국가
    columns="year",    # 열 인덱스: 연도
    values="value",    # 집계 대상: value
    aggfunc="mean",    # 집계 함수: 평균
)
print(pt)


예제 2: 다중 집계 (multiple aggfunc)

sum(합계)와 count(개수)를 동시에 보고

MultiIndex columns 를 얻음.

# 여러 집계 함수 적용: 합계와 개수를 동시에
pt = df.pivot_table(
    index="country",   # 국가별
    columns="year",    # 연도별
    values="value",    # 집계 대상
    aggfunc=["sum", "count"]  # 합계와 개수
)


예제 3: 결측 대체와 합계 추가

NaN을 0으로 바꾸고, 전체 합계(All) 행/열을 추가.

pt = df.pivot_table(
    index="country",
    columns="year",
    values="value",
    aggfunc="sum",      # 합계
    fill_value=0,       # 결측값 0으로 대체
    margins=True,       # 합계 행/열 추가
    margins_name="Total"
)


예제 4: 컬럼별 서로 다른 집계

여러 값 컬럼에 각기 다른 집계 함수를 적용.

df2 = pd.DataFrame({
    "country": ["Korea","Korea","USA","USA","USA"],
    "year":    [2020,2020,2020,2020,2021],
    "sales":   [100, 120, 200, 220, 300],
    "qty":     [10, 12, 20, 22, 30],
})

# sales는 합계, qty는 평균
pt = df2.pivot_table(
    index="country",
    columns="year",
    values={"sales": "sum", "qty": "mean"}
)


예제 5: 다중 인덱스/컬럼

행과 열에 복수 차원을 주어 계층적 피벗을 만든다.

df3 = pd.DataFrame({
    "region":  ["APAC","APAC","APAC","NA","NA"],
    "country": ["Korea","Korea","Japan","USA","USA"],
    "year":    [2020,2021,2020,2020,2021],
    "value":   [1,2,3,4,5],
})

# 지역-국가를 행으로, 연도를 열로 사용
pt = df3.pivot_table(
    index=["region", "country"],  # 다중 행 인덱스
    columns=["year"],             # 열 인덱스
    values="value",
    aggfunc="sum",
    fill_value=0
)


예제 6: 특정 집계 방식

중복이 있어도 평균이 아닌 "first"(첫 값)이나 "max"(최댓값)만 취한다.

pt_first = df.pivot_table(
	index="country", 
    columns="year", 
    values="value", 
    aggfunc="first",
)
pt_max   = df.pivot_table(
	index="country", 
    columns="year", 
    values="value", 
    aggfunc="max",
)


주의: observed=True 옵션

범주형(Categorical) 변수 사용 시,

  • 가능한 모든 조합을 보여줄지(observed=False)
  • 실제로 나타난 조합만 보여줄지(observed=True)를 선택한다.

현재 pandas 2.3.1+ 이후부터는 observed 파라메터를 category data를 사용하는 경우 꼭 명시적으로 지정해야 함.

df2 = pd.DataFrame({
    "region": pd.Categorical(["APAC", "APAC", "NA"], categories=["APAC", "EU", "NA"]),
    "year":   pd.Categorical([2020, 2021, 2020], categories=[2020, 2021]),
    "value":  [1, 2, 3],
})

# observed=False (기본): 가능한 모든 조합 표시
pt_all = df2.pivot_table(
    index="region", columns="year",
    values="value", aggfunc="sum", fill_value=0
)
print(pt_all)  # EU도 표시됨

# observed=True: 실제로 나타난 조합만 표시
pt_obs = df2.pivot_table(
    index="region", columns="year",
    values="value", aggfunc="sum", fill_value=0, 
    observed=True,
)
print(pt_obs)  # EU 제외
  • observed=False: 모든 범주 조합 표시(sparse table 위험)
    • 기본값이지만...
    • Pandas 2.3.1 + 에서는 deprecate 예정으로 반드시 observed 파라메터를 설정하는 것을 권고.
  • observed=True: 실제 관측된 조합만 표시하여 간결하고 성능 향상

참고: pivot_table() vs.  groupby 비교

pivot_table()은 사실상 groupby + agg + unstack의 축약형이다.

# pivot_table
pt = df.pivot_table(index="country", columns="year", values="value", aggfunc="sum", fill_value=0)

# 동일한 결과를 groupby로 구현
gt = (
    df.groupby(["country", "year"])["value"]  # 국가-연도별 그룹
      .sum()                                  # 합계
      .unstack("year")                        # 열로 펼치기
      .fillna(0)                              # 결측치 0 대체
)
  • syntatic sugar를 폄하하는 분들도 보이지만,
  • 많은 의사소통이 필요한 경우는 groupby 보다는 pivot_table이 훨씬 편하다.

요약

  • 중복 데이터 여부 확인: pivot vs pivot_table 선택 기준
  • 원하는 집계 함수 정의: mean, sum, first
  • NaN 처리 필요 여부: fill_value 사용
  • 전체 합계 필요 여부: margins 옵션 사용
  • 범주형 조합 최적화: observed=True 사용.

같이 보면 좋은 자료들

2025.08.20 - [Python/pandas] - [Term] pivot 이란?

 

[Term] pivot 이란?

1. pivot 이란?Pandas에서 pivot은 데이터의 모양(shape)을 바꾸는 기능 을 가리킴: reshaping특정 column의 값들을 row 인덱스(index)로,또 다른 column의 값들을 열(columns)로지정하는 테이블을 만들고,해당 조합(

ds31x.tistory.com

2025.08.20 - [Python/pandas] - [Pandas] groupby() 메서드

 

[Pandas] groupby() 메서드

groupby() 메서드는 DataFrame의 데이터를 하나 이상의 키를 기준으로 그룹화(grouping) 하여, 각 그룹에 대해 집계(aggregation)·변환(transform)·필터(filter) 연산을 적용할 수 있게 해주는 도구임.Split–Apply

ds31x.tistory.com


2025.05.16 - [Python] - [ML] pandas.DataFrame 에서 EDA에 적합한 메서드 요약

 

[ML] pandas.DataFrame 에서 EDA에 적합한 메서드 요약

Pandas DataFrame에서 탐색적 데이터 분석(EDA)에 사용할 수 있는 주요 메서드들은 다음과 같음:2024.05.18 - [분류 전체보기] - [ML] Exploratory Data Analysis (EDA) [ML] Exploratory Data Analysis (EDA)Exploratory Data Analysis (

ds31x.tistory.com


 

728x90