- 在 Pandas 中,我们经常需要将数据转换为频率表的形式,以便于分析和可视化。例如,我们有一个数据框,包含了两列数据:
Col X和Col Y,其中Col X是类别列,Col Y是值列。我们希望将数据转换为一个频率表,其中每一行代表一个类别,每一列代表一个值,表中的值表示该类别中出现该值的数量。
2、解决方案
有多种方法可以将 Pandas 数据框转换为频率表。下面介绍四种常用的方法:
- 使用
pd.crosstab()函数
pd.crosstab() 函数可以直接将两列数据转换为频率表。它的语法如下:
pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True)
其中,index 和 columns 是要作为频率表索引和列的数据列,values 是要聚合的值列,rownames 和 colnames 分别是索引和列的名称,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
- 使用
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
- 使用
pivot_table()函数
还可以使用 pivot_table() 函数将数据转换为频率表。它的语法如下:
df.pivot_table(index=index, columns=columns, values=values, aggfunc=None, fill_value=None, margins=False, dropna=True)
其中,index 和 columns 是要作为频率表索引和列的数据列,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
- 使用
set_index()和unstack()函数
也可以使用 set_index() 和 unstack() 函数将数据转换为频率表。它的语法如下:
df.set_index([index1, index2]).unstack()
其中,index1 和 index2 是要作为频率表索引的数据列,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