pd.crosstab()
用于计算分组的频率,算是一种特殊的pivot_table()
是顶级类函数
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None,
margins=False, margins_name='All', dropna=True, normalize=False)
参数 | 类型 | 说明 |
index | array-like Series list of arrays/Series |
行分组键 |
columns | array-like Series list of arrays/Series |
列分组键 |
margins | boolean | False 默认值 增加一行/列 ‘总计’ |
margins_name | string | All 默认值 |
normalize | boolean | False 默认值 'index' or 1,normalize 每行 'columns' or 0,normalize 每列 'All' or 'True',normalize 全部 如果 margins = True,则 margins 也会被 normalize 值 = 单元格数据 / 数据总和 (浮点数格式) |
values | ||
aggfunc | ||
rownames | ||
colnames | ||
dropna | boolean | True 默认值 如果某列的数据全是 NaN,则被删除 |
>>> data
ID Gender Nation LR
0 1 M USA Left
1 2 M CHN Left
2 3 F USA Right
3 4 M CHN Right
4 5 F CHN Right
5 6 M CHN Right
6 7 F USA Right
7 8 F USA Left
8 9 M CHN Right
9 10 F USA Right
# 根据国别,查看左右手人数
>>> pd.crosstab(data.Nation, data.LR)
LR Left Right
Nation
CHN 1 4
USA 2 3
# 根据性别,查看左右手人数
>>> pd.crosstab(data.Gender, data.LR)
LR Left Right
Gender
F 1 4
M 2 3
# 根绝国别,查看男女人数
>>> pd.crosstab(data.Nation,data.Gender)
Gender F M
Nation
CHN 1 4
USA 4 1
------------------------------------------------------------------------------------
# 生成多级级联索引
>>> pd.crosstab([data.Nation,data.Gender],data.LR)
LR Left Right
Nation Gender
CHN F 0 1
M 1 3
USA F 1 3
M 1 0
>>> pd.crosstab(data.Nation,[data.Gender,data.LR])
Gender F M
LR Left Right Left Right
Nation
CHN 0 1 1 3
USA 1 3 1 0
------------------------------------------------------------------------------------
# margins 总计
# normalize='index' margins 作为新的一行,出现在底部
# normalize='columns' margins 作为新的一列,出现在最右
# normalize=True 两个margins,出现在底部和最右
>>> pd.crosstab(data.Nation,data.LR,margins=True)
LR Left Right All
Nation
CHN 1 4 5
USA 2 3 5
All 3 7 10
>>> pd.crosstab(data.Nation,data.LR,margins=True,margins_name='Sub')
LR Left Right Sub
Nation
CHN 1 4 5
USA 2 3 5
Sub 3 7 10
------------------------------------------------------------------------------------
# normalize
# 每个数据/总数 浮点数格式
>>> pd.crosstab(data.Nation,data.LR)
LR Left Right
Nation
CHN 1 4
USA 2 3
# 1/10 4/10
# 2/10 3/10
# 10 是总数
>>> pd.crosstab(data.Nation,data.LR,normalize=True)
LR Left Right
Nation
CHN 0.1 0.4
USA 0.2 0.3
# 1/3 4/7
# 2/3 3/7
# 3 7 是每列的总计
>>> pd.crosstab(data.Nation,data.LR,normalize='columns') /
>>> pd.crosstab(data.Nation,data.LR,normalize=1)
LR Left Right
Nation
CHN 0.333333 0.571429
USA 0.666667 0.428571
# 1/5 4/5
# 2/5 3/5
# 5 5 是每行的总计
>>> pd.crosstab(data.Nation,data.LR,normalize='index') /
>>> pd.crosstab(data.Nation,data.LR,normalize=0)
LR Left Right
Nation
CHN 0.2 0.8
USA 0.4 0.6
>>> pd.crosstab(data.Nation,data.LR,margins=True,normalize=True)
LR Left Right All
Nation
CHN 0.1 0.4 0.5
USA 0.2 0.3 0.5
All 0.3 0.7 1.0
crosstab()一种特殊的pivot_table(),pivot_table()也可以实现crosstab()的功能
>>> pd.crosstab(data.Nation, data.LR)
>>> pd.pivot_table(data=data,index='Nation',columns='LR',values='ID',aggfunc=len)
LR Left Right
Nation
CHN 1 4
USA 2 3
另,关于 pivot() 与 pivot_table() 的区别,在这里体现出来,由于有重复数据,所以pivot()报错
data.pivot(index='Nation',columns='LR',values='ID')
ValueError: Index contains duplicate entries, cannot reshape