본문으로 건너뛰기
김신건의 로그

[Pandas] crosstab

· 수정 · 📖 약 1분 · 209자/단어 #python #pandas #aggregation #contingency
Pandas crosstab, pd.crosstab, 교차표

정의

pd.crosstab(index, columns) 는 두 (또는 그 이상의) Series 로 교차 빈도표 (contingency table) 를 만든다. SQL 의 PIVOT 또는 Excel 의 피벗 테이블과 비슷.

pd.crosstab(df['gender'], df['plan'])

기본 (count)

python
import pandas as pd
df = pd.DataFrame({
  'gender': ['M','F','M','F','M','F'],
  'plan': ['basic','pro','basic','basic','pro','pro'],
})
print(pd.crosstab(df['gender'], df['plan']))
결과
plan    basic  pro
gender
F           1    2
M           2    1
gender \ planbasicpro
F12
M21

margins (소계 / 총계 행)

pd.crosstab(df['gender'], df['plan'], margins=True, margins_name='Total')
python
import pandas as pd
df = pd.DataFrame({
  'gender': ['M','F','M','F','M','F'],
  'plan': ['basic','pro','basic','basic','pro','pro'],
})
print(pd.crosstab(df['gender'], df['plan'], margins=True))
결과
plan    basic  pro  All
gender
F           1    2    3
M           2    1    3
All         3    3    6

normalize (비율)

pd.crosstab(df['gender'], df['plan'], normalize='index')    # 행 기준 비율
pd.crosstab(df['gender'], df['plan'], normalize='columns')  # 열 기준
pd.crosstab(df['gender'], df['plan'], normalize='all')      # 전체
python
import pandas as pd
df = pd.DataFrame({
  'gender': ['M','F','M','F','M','F'],
  'plan': ['basic','pro','basic','basic','pro','pro'],
})
print(pd.crosstab(df['gender'], df['plan'], normalize='index'))
결과
plan       basic       pro
gender
F       0.333333  0.666667
M       0.666667  0.333333

각 행 합이 1. 행 기준 분포.

values + aggfunc (합계, 평균 등)

pd.crosstab(
    df['gender'],
    df['plan'],
    values=df['amount'],
    aggfunc='sum',
)

count 가 아닌 sum/mean 등의 집계. 사실상 Pandas pivot_table 과 같다.

다중 index / 다중 columns

pd.crosstab(
    [df['gender'], df['region']],
    df['plan']
)
# MultiIndex 행

crosstab vs pivot_table

항목crosstabpivot_table
입력Series (또는 array)DataFrame + 컬럼명
기본 aggfunccountmean
marginsmargins=margins=
다중 그룹list 전달list 전달

기능은 거의 같다. 입력 형태로 선택.

# 같은 결과
pd.crosstab(df['gender'], df['plan'])
df.pivot_table(index='gender', columns='plan', aggfunc='size')

자주 만나는 함정

1. 합산 vs 카운트

pd.crosstab(df['gender'], df['plan'])                              # count
pd.crosstab(df['gender'], df['plan'], values=df['amount'], aggfunc='sum')  # sum

values 와 aggfunc 를 같이 줘야 합산 가능.

2. 결측치

pd.crosstab(df['gender'], df['plan'], dropna=False)
# NaN 도 그룹으로 포함

3. normalize 의 string 값

'index' / 'columns' / 'all' / True / False 만 유효.

참고

이 글의 용어 (3개)
[Pandas] groupbypandas
정의 는 데이터를 그룹으로 나누고 (split), 각 그룹에 함수를 적용 (apply), 결과를 합쳐 (combine) 새 DataFrame 으로 만드는 split-apply-c…
[Pandas] pivotpandas
정의 는 long-format → wide-format 변환. 한 열의 고유 값들이 새 컬럼이 되고, 원래 데이터는 그 자리에 배치된다. 집계가 없으므로 같은 (index, co…
[Pandas] pivot_tablepandas
정의 는 의 확장. 집계 함수를 동반 해 중복 (index, columns) 도 처리. Excel 의 피벗 테이블과 가장 가까운 기능. 기본 <CodeWithOutput lang…

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기