판다스(Pandas)에서 데이터를 재구조화하거나 요약하는 대표적인 방법으로 crosstab과 pivot
1. pandas.crosstab
주요 목적: 범주형 데이터(카테고리) 간의 빈도표(또는 집계 테이블) 작성
함수 형태: pd.crosstab(index, columns, values=None, aggfunc=None, ...)
집계 함수 사용: aggfunc를 통해 합(sum), 평균(mean), 개수(count) 등 다양한 집계 가능
마진(margins) 추가: margins=True로 전체 합이나 전체 평균 등을 함께 볼 수 있음
중복 데이터: 중복 데이터를 한꺼번에 집계할 수 있음
주로 사용 예시:
성별, 지역별 판매량 합계
제품 카테고리, 월별 판매 건수 등
간단 예시
import pandas as pd
df = pd.DataFrame({
'성별': ['남', '여', '여', '남', '여', '남'],
'도시': ['서울', '부산', '서울', '대구', '부산', '서울'],
'판매량': [100, 150, 200, 130, 170, 160]
})
ct = pd.crosstab(
df['성별'], # index
df['도시'], # columns
values=df['판매량'],
aggfunc='sum', # 합계를 구함
margins=True # 전체 합 추가
)
print(ct)
2. pandas.pivot
주요 목적: 데이터를 인덱스와 열을 기준으로 형상 재구성(피벗팅)
함수 형태: df.pivot(index=None, columns=None, values=None)
집계 기능 없음: 동일한 인덱스/열 조합에 중복 데이터가 있으면 에러 발생
집계가 필요할 경우 pivot_table 사용
고유 조합(Unique Combination) 필요: index와 columns가 유일한 조합이어야 함
주로 사용 예시:
시계열 데이터에서 날짜를 인덱스로, 제품명을 열로 하여 판매량을 나열
인덱스와 열을 재배치해서 분석하기 좋게 표 형태 변환
간단 예시
import pandas as pd
df = pd.DataFrame({
'날짜': ['2025-01-01', '2025-01-01', '2025-01-02', '2025-01-02'],
'상품': ['A', 'B', 'A', 'B'],
'판매량': [100, 150, 200, 130]
})
pivot_df = df.pivot(index='날짜', columns='상품', values='판매량')
print(pivot_df)
3. 주요 차이점 한눈에 보기
특징 crosstab pivot 주 용도 범주형 데이터의 빈도/집계 인덱스와 열을 이용한 데이터 재구조화 함수 형태 pd.crosstab(index, columns, values, aggfunc, ...) df.pivot(index, columns, values) 집계 함수 지원 여부 O, aggfunc 사용 X, 중복 데이터가 있으면 에러 마진(margins) 지원 O, margins=True 옵션 X 인덱스-열 조합 중복 가능 (집계됨) 유일해야 함 (중복 시 에러) 대표적 사용 사례 범주형 변수 간 빈도표, 교차 분석 시계열 또는 특정 기준으로 데이터를 재배열
4. 추가 팁: pivot_table
pivot에서 집계를 하고 싶다면, pivot_table 함수를 사용해야 합니다.
pivot_table은 crosstab처럼 aggfunc를 지정할 수 있으며, 중복 데이터를 집계해줍니다.
pivot_table_df = pd.pivot_table(
df,
index='날짜',
columns='상품',
values='판매량',
aggfunc='sum',
margins=True
)
print(pivot_table_df)
정리
crosstab: 범주형 데이터의 빈도나 합계를 간단히 구할 때 쓰는 교차표 함수로, 중복 데이터를 그룹화해 집계할 수 있음.
pivot: 인덱스와 열을 기준으로 데이터를 재배열하기 위한 함수로, 집계 기능이 없음. 중복 데이터가 허용되지 않음.
pivot_table: pivot의 확장판으로, 집계가 필요한 경우 사용.
사용하려는 목적이 빈도/집계냐, 단순 재구조화냐에 따라 crosstab과 pivot을 구분해서 쓰고, 집계 기능이 필요하다면 pivot_table을 고려하시면 됩니다.