使用 Pandas 创建频率表

102 阅读3分钟
  1. 在 Pandas 中,我们经常需要将数据转换为频率表的形式,以便于分析和可视化。例如,我们有一个数据框,包含了两列数据:Col XCol Y,其中 Col X 是类别列,Col Y 是值列。我们希望将数据转换为一个频率表,其中每一行代表一个类别,每一列代表一个值,表中的值表示该类别中出现该值的数量。

2、解决方案

有多种方法可以将 Pandas 数据框转换为频率表。下面介绍四种常用的方法:

  1. 使用 pd.crosstab() 函数

pd.crosstab() 函数可以直接将两列数据转换为频率表。它的语法如下:

pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True)

其中,indexcolumns 是要作为频率表索引和列的数据列,values 是要聚合的值列,rownamescolnames 分别是索引和列的名称,aggfunc 是聚合函数,margins 是是否显示总计行和列,dropna 是是否删除缺失值。

使用 pd.crosstab() 函数将数据转换为频率表的示例代码如下:

import pandas as pd

df = pd.DataFrame({
    "Col X": ["class 1", "class 2", "class 3", "class 2"],
    "Col Y": ["cat 1", "cat 1", "cat 2", "cat 3"]
})

freq_table = pd.crosstab(df["Col X"], df["Col Y"])

print(freq_table)

输出结果如下:

Col Y    cat 1  cat 2  cat 3
Col X
class 1      1      0      0
class 2      1      0      1
class 3      0      1      0
  1. 使用 groupby()unstack() 函数

也可以使用 groupby()unstack() 函数将数据转换为频率表。它的语法如下:

df.groupby(by).size().unstack()

其中,by 是要分组的数据列,size() 函数是计算每组数据的数量,unstack() 函数是将数据展开为频率表。

使用 groupby()unstack() 函数将数据转换为频率表的示例代码如下:

import pandas as pd

df = pd.DataFrame({
    "Col X": ["class 1", "class 2", "class 3", "class 2"],
    "Col Y": ["cat 1", "cat 1", "cat 2", "cat 3"]
})

freq_table = df.groupby(["Col X", "Col Y"]).size().unstack(fill_value=0)

print(freq_table)

输出结果如下:

Col Y    cat 1  cat 2  cat 3
Col X
class 1      1      0      0
class 2      1      0      1
class 3      0      1      0
  1. 使用 pivot_table() 函数

还可以使用 pivot_table() 函数将数据转换为频率表。它的语法如下:

df.pivot_table(index=index, columns=columns, values=values, aggfunc=None, fill_value=None, margins=False, dropna=True)

其中,indexcolumns 是要作为频率表索引和列的数据列,values 是要聚合的值列,aggfunc 是聚合函数,fill_value 是填充缺失值,margins 是是否显示总计行和列,dropna 是是否删除缺失值。

使用 pivot_table() 函数将数据转换为频率表的示例代码如下:

import pandas as pd

df = pd.DataFrame({
    "Col X": ["class 1", "class 2", "class 3", "class 2"],
    "Col Y": ["cat 1", "cat 1", "cat 2", "cat 3"]
})

freq_table = df.pivot_table(index="Col X", columns="Col Y", aggfunc=len, fill_value=0)

print(freq_table)

输出结果如下:

Col Y    cat 1  cat 2  cat 3
Col X
class 1      1      0      0
class 2      1      0      1
class 3      0      1      0
  1. 使用 set_index()unstack() 函数

也可以使用 set_index()unstack() 函数将数据转换为频率表。它的语法如下:

df.set_index([index1, index2]).unstack()

其中,index1index2 是要作为频率表索引的数据列,unstack() 函数是将数据展开为频率表。

使用 set_index()unstack() 函数将数据转换为频率表的示例代码如下:

import pandas as pd

df = pd.DataFrame({
    "Col X": ["class 1", "class 2", "class 3", "class 2"],
    "Col Y": ["cat 1", "cat 1", "cat 2", "cat 3"]
})

freq_table = df.set_index(["Col X", "Col Y"])["Col Y"].unstack(fill_value=0)

print(freq_table)

输出结果如下:

Col Y    cat 1  cat 2  cat 3
Col X
class 1      1      0      0
class 2      1      0      1
class 3      0      1      0