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