Python中的pandas.crosstab()函数

  • Post category:Python

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指定了对单元格内数据的处理方式,如此返回的交叉表中每个单元格都将是对应列的求和结果。