Pandas_聚合数据_crosstab()_1

pd.crosstab()
用于计算分组的频率,算是一种特殊的pivot_table()
是顶级类函数

pandas.crosstab(indexcolumnsvalues=Nonerownames=Nonecolnames=Noneaggfunc=None,

margins=Falsemargins_name='All'dropna=Truenormalize=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

 

你可能感兴趣的:(Pandas_聚合数据)