[Pandas] crosstab
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 \ plan | basic | pro |
|---|---|---|
| F | 1 | 2 |
| M | 2 | 1 |
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 6normalize (비율)
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
| 항목 | crosstab | pivot_table |
|---|---|---|
| 입력 | Series (또는 array) | DataFrame + 컬럼명 |
| 기본 aggfunc | count | mean |
| margins | margins= | 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…
💬 댓글