[Pandas] pivot_table
Pandas pivot_table, pd.pivot_table, Excel pivot
정의
DataFrame.pivot_table(...) 는 Pandas pivot 의 확장. 집계 함수를 동반 해 중복 (index, columns) 도 처리. Excel 의 피벗 테이블과 가장 가까운 기능.
pivot_table 처리 흐름
flowchart LR
A["원본 DataFrame\n(행이 많고 중복 존재)"] --> B["index 로 행 분류"]
B --> C["columns 로 열 분류"]
C --> D["aggfunc 로 집계"]
D --> E["2D 요약 테이블"]
D --> F["margins=True 로 합계 행/열 추가"]
사용 상황
| 상황 | 패턴 |
|---|---|
| 월별/카테고리별 매출 요약 | index='month', columns='category' |
| 두 차원 교차 분석 | index=A, columns=B, aggfunc='count' |
| Excel 피벗과 동일한 결과 | margins=True |
| 코호트 분석 | index='cohort', columns='period' |
| 결측 조합을 0 으로 채우기 | fill_value=0 |
기본
df.pivot_table(
index='date',
columns='product',
values='sales',
aggfunc='sum',
)
python
import pandas as pd
df = pd.DataFrame({
'date': ['2024-01', '2024-01', '2024-01', '2024-02', '2024-02'],
'product': ['A', 'A', 'B', 'A', 'B'],
'sales': [100, 50, 200, 150, 250],
})
print(df.pivot_table(index='date', columns='product', values='sales', aggfunc='sum')) 결과
product A B
date
2024-01 150 200
2024-02 150 250| date | A | B |
|---|---|---|
| 2024-01 | 150 (= 100+50) | 200 |
| 2024-02 | 150 | 250 |
여러 aggfunc
df.pivot_table(
index='date',
columns='product',
values='sales',
aggfunc=['sum', 'mean', 'count'],
)
결과는 최상위 컬럼이 함수 이름인 MultiIndex.
margins (총계)
df.pivot_table(
index='date',
columns='product',
values='sales',
aggfunc='sum',
margins=True,
margins_name='Total',
)
| date | A | B | Total |
|---|---|---|---|
| 2024-01 | 150 | 200 | 350 |
| 2024-02 | 150 | 250 | 400 |
| Total | 300 | 450 | 750 |
Excel 의 총계 행/열과 동일.
여러 index / values
df.pivot_table(
index=['region', 'date'],
columns='product',
values=['sales', 'qty'],
aggfunc='sum',
)
MultiIndex 행 + MultiIndex 컬럼.
fill_value
df.pivot_table(..., fill_value=0) # NaN 을 0 으로
groupby 와의 관계
pivot_table 은 사실 groupby + unstack 의 단축형.
# 둘은 같음
df.pivot_table(index='date', columns='product', values='sales', aggfunc='sum')
df.groupby(['date', 'product'])['sales'].sum().unstack('product')
crosstab 과의 관계
Pandas crosstab 은 pivot_table 의 빈도 특화 버전.
# 두 컬럼의 빈도 교차표
pd.crosstab(df['region'], df['product'])
# pivot_table 로 동일하게:
df.pivot_table(index='region', columns='product', aggfunc='size', fill_value=0)
실전 패턴
월별/카테고리별 매출 보고서
report = df.pivot_table(
index='month',
columns='category',
values='revenue',
aggfunc='sum',
margins=True,
fill_value=0,
)
report.to_excel('monthly_report.xlsx')
코호트 분석
df['cohort'] = df['signup_month']
df['period'] = (df['active_month'] - df['cohort']).dt.days // 30
cohort_table = df.pivot_table(
index='cohort',
columns='period',
values='user_id',
aggfunc='nunique',
)
여러 값 동시 + 누락 컬럼 채우기
pivot = df.pivot_table(
index='week',
columns='channel',
values=['revenue', 'orders'],
aggfunc={'revenue': 'sum', 'orders': 'count'},
fill_value=0,
margins=True,
)
결과 컬럼 평탄화
pivot = df.pivot_table(
index='date',
columns='product',
values='sales',
aggfunc=['sum', 'mean'],
)
# MultiIndex 컬럼 평탄화
pivot.columns = ['_'.join(c).strip() for c in pivot.columns]
# ['sum_A', 'sum_B', 'mean_A', 'mean_B']
pandas 2.x: 정렬 + reset
result = (
df.pivot_table(
index='date',
columns='region',
values='revenue',
aggfunc='sum',
fill_value=0,
)
.sort_index()
.reset_index()
)
함정
1. 기본 aggfunc 가 mean
df.pivot_table(index='date', columns='product', values='sales')
# 명시 안 하면 'mean'
매출 같은 경우 ‘sum’ 을 명시하자.
2. observed (categorical)
df.pivot_table(index='cat_col', ..., observed=False)
# Categorical index 의 모든 카테고리 포함 (등장 안 한 것도)
pandas 2.x 에서는 observed=False 가 deprecated, 명시 권장.
3. dropna
df.pivot_table(index='date', columns='product', values='sales', dropna=False)
# NaN 행을 보존 (기본은 드롭)
4. values 생략 시 전체 컬럼
df.pivot_table(index='date', columns='product', aggfunc='sum')
# values 생략 시 수치 컬럼 전부 집계 → 과도한 MultiIndex 컬럼
항상 values 를 명시하는 것이 안전.
5. sort=False 와 컬럼 순서
df.pivot_table(index='date', columns='product', values='sales',
aggfunc='sum', sort=False)
# sort=False: 원본 등장 순서 유지 (기본은 정렬)
6. margins + 여러 aggfunc
df.pivot_table(
...,
aggfunc=['sum', 'mean'],
margins=True,
)
# margins 의 'All' 행/열은 sum 에만 적용됨
# mean 의 'All' 은 예상과 다를 수 있음 (행 평균의 평균)
관련 위키
이 글의 용어 (6개)
- [Pandas] agg / aggregatepandas
- 정의 는 여러 집계 함수를 한 번에 적용 한다. , , 모두에서 사용 가능. 는 같은 함수의 별칭. agg 처리 흐름 사용 상황 | 상황 | 패턴 | |:---|:---| | 전…
- [Pandas] crosstabpandas
- 정의 는 두 (또는 그 이상의) Series 로 교차 빈도표 (contingency table) 를 만든다. SQL 의 PIVOT 또는 Excel 의 피벗 테이블과 비슷. 사용 …
- [Pandas] groupbypandas
- 정의 는 데이터를 그룹으로 나누고 (split), 각 그룹에 함수를 적용 (apply), 결과를 합쳐 (combine) 새 DataFrame 으로 만드는 split-apply-c…
- [Pandas] meltpandas
- 정의 는 의 역방향. wide-format → long-format 변환. 여러 컬럼을 두 컬럼 ( , ) 으로 합친다. 장기간 시계열 데이터나 시각화 라이브러리 (seaborn…
- [Pandas] pivotpandas
- 정의 는 long-format → wide-format 변환. 한 열의 고유 값들이 새 컬럼이 되고, 원래 데이터는 그 자리에 배치된다. 집계가 없으므로 같은 (index, co…
- [Pandas] stack / unstackpandas
- 정의 - : 가장 안쪽 컬럼 레벨 -> 행 레벨 (DataFrame -> Series 또는 더 좁은 DataFrame) - : 가장 안쪽 행 레벨 -> 컬럼 레벨 / 의 Mult…
💬 댓글