Pandas_聚合数据_crosstab()_2

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 array-like

可选项

根据 index 和 columns 的分组后,计算 values 项的值,计算规则由 aggfunc 决定

(values 和 aggfunc 成对出现)

aggfunc function

可选项

np.sum,np.mean,len,... ...

(values 和 aggfunc 成对出现)
rownames sequence 序列

None 默认值

pd.crosstab()操作数组时,设定 row's name,而不使用默认名称

colnames sequence 序列

None 默认值

pd.crosstab()操作数组时,设定 column's name,而不使用默认名称

dropna boolean

True 默认值

如果某列的数据全是 NaN,则被删除

# 根据分组,聚合运算第三方数据
# 该例,根据A B两列分组,聚合运算 C 列数据
# 设定参数 values aggfunc
>>> foo, bar, dull, shiny, one, two = "foo", "bar", "dull", "shiny", "one", "two"
>>> df = pd.DataFrame({'A':[foo, foo, bar, bar, foo, foo],
                       'B': [one, two, one, two, one,two],
                       'C': [1, 2, np.nan, 3, np.nan,4]})
>>> df
        A	B	C
0	foo	one	1.0
1	foo	two	2.0
2	bar	one	NaN
3	bar	two	3.0
4	foo	one	NaN
5	foo	two	4.0

# 计算A B分组的频率
>>> pd.crosstab(df.A,df.B)
B	one	two
A		
bar	1	1
foo	2	2

# 以A B分组,计算出每组中 C 值的和
>>> pd.crosstab(df.A, df.B, values=df.C, aggfunc=np.sum)
B	one	two
A		
bar	0.0	3.0
foo	1.0	6.0

# 以A B分组,计算出每组中 C 值的平均值
>>> pd.crosstab(df.A, df.B, values=df.C, aggfunc=np.mean)
B	one	two
A		
bar	NaN	3.0
foo	1.0	3.0

# 以A B分组,计算出每组中 C 值的数量
>>> pd.crosstab(df.A, df.B, values=df.C, aggfunc=len)
B	one	two
A		
bar	1.0	1.0
foo	2.0	2.0

========================================================================================
# 使用 crosstab() 操作数组 Array
# 即使数组 Array 之间没有任何逻辑关联
# 将上方的 DataFrame 转换成3个数组 Array (也就是将3个 Series 转换成3个数组 Array)

>>> foo, bar, dull, shiny, one, two = "foo", "bar", "dull", "shiny", "one", "two"
>>> x=np.array([foo, foo, bar, bar, foo, foo])
>>> y=np.array([one, two, one, two, one,two])
>>> z=np.array([1, 2, np.nan, 3, np.nan,4])

# 类似于计算分组频率
>>> pd.crosstab(x,y)
col_0	one	two
row_0		
bar	1	1
foo	2	2

# 类似于计算分组频率
# 并设定 rownames colnames
>>> pd.crosstab(x,y,rownames=["XX"],colnames=["YY"])
YY	one	two
XX		
bar	1	1
foo	2	2

# 同样可以设定多层级联索引
>>> pd.crosstab(x,[y,z])
col_0	one	        two
col_1	1.0	2.0	3.0	4.0
row_0				
bar	0	0	1	0
foo	1	1	0	1

# 同样可以设定多层级联索引
# 并设定 rownames colnames
>>> pd.crosstab(x,[y,z],rownames=["XX"],colnames=["YY","ZZ"])
YY	one             two
ZZ	1.0	2.0	3.0	4.0
XX				
bar	0	0	1	0
foo	1	1	0	1

# 以数组x y分组,计算出每组中 z 值的和
>>> pd.crosstab(x,y,values=z,aggfunc=np.sum)
col_0	one	two
row_0		
bar	0.0	3.0
foo	1.0	6.0

# 以数组x y分组,计算出每组中 z 值的平均值
pd.crosstab(x,y,values=z,aggfunc=np.mean)
col_0	one	two
row_0		
bar	NaN	3.0
foo	1.0	3.0

# 以数组x y分组,计算出每组中 z 值的数量
pd.crosstab(x,y,values=z,aggfunc=len)
col_0	one	two
row_0		
bar	1.0	1.0
foo	2.0	2.0

# 以数组x y分组,计算出每组中 z 值的和,并设定 rownames colnames
>>> pd.crosstab(x,y,values=z,aggfunc=np.sum,rownames=["XX"],colnames=["YY"])
YY	one	two
XX		
bar	0.0	3.0
foo	1.0	6.0





 

 

 

 

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