
.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이 훨씬 편하다.
요약
- 중복 데이터 여부 확인:
pivotvspivot_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
'Python > pandas' 카테고리의 다른 글
| [Pandas] groupby() 메서드 (0) | 2025.08.20 |
|---|---|
| [Term] pivot 이란? (0) | 2025.08.20 |
| [ML] pandas.DataFrame 에서 EDA에 적합한 메서드 요약 (0) | 2025.05.16 |
| [DL] Pandas 로 csv 읽기: read_csv() (0) | 2024.04.13 |
| [pandas] 데이터 타입에 따른 column 추출: select_dtypes() (0) | 2024.01.12 |