Python中的pandas.crosstab()函数是用于计算交叉表的函数。它可以根据指定的行和列来计算数据中的每个元素出现的次数,并以交叉表的形式返回结果。
crosstab函数的用法如下:
pd.crosstab(index, columns, values=None, aggfunc=None, rownames=None, colnames=None,
margins=False, margins_name='All', dropna=True, normalize=False)
参数说明:
- index:需要生成交叉表的行标签(可以是多个)
- columns:需要生成交叉表的列标签(可以是多个)
- values:用于聚合的列名,默认为None,计算出每个交叉表元素的数量
- aggfunc:用于聚合的函数名,如sum、mean、median等,默认为None,计算出每个交叉表元素的数量
- rownames:行标签的名称
- colnames:列标签的名称
- margins:是否在最后一行/列加上总计
- margins_name:如果margins为True,则总计的名称为该参数的值
- dropna:是否删除缺失项
- normalize:是否对结果进行标准化计算,默认为False,表示计数;如果为True,则为频率(比例)
示例代码:
import pandas as pd
import numpy as np
# 构造数据
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
# 生成交叉表
pd.crosstab(df['A'], df['B'])
输出结果:
B one three two
A
bar 2 1 2
foo 2 1 2
以上代码中,我们生成了一个DataFrame,包含4列数据。其中A/B为分类变量,C/D为数值变量。接着我们使用crosstab函数,分别将A和B作为行标签和列标签,计算出各个分类变量出现的频数,返回交叉表结果。
如果要在交叉表的每个单元格中填充其他的数值,可以使用values参数,如下所示:
pd.crosstab(df['A'], df['B'], values=df['C'], aggfunc=np.sum)
输出结果:
B one three two
A
bar -0.060587 -1.777550 -1.834383
foo 0.623429 0.691117 1.565818
以上代码中,我们通过values参数指定了填充数据的列名,并使用aggfunc指定了对单元格内数据的处理方式,如此返回的交叉表中每个单元格都将是对应列的求和结果。