pandas 的
crosstab
和 pivot_table
函数似乎都提供完全相同的功能。有什么不同吗?
两者之间的主要区别是
pivot_table
期望您的输入数据已经是一个DataFrame;您将 DataFrame 传递给 pivot_table
并通过将列名称作为字符串传递来指定 index
/columns
/values
。使用 cross_tab
,您不一定需要输入 DataFrame,因为您只需为 index
/columns
/values
传递类似数组的对象。
查看 crosstab
的
源代码,它本质上采用您传递的类似数组的对象,创建一个 DataFrame,然后根据需要调用
pivot_table
。
一般来说,如果您已经有一个 DataFrame,请使用
pivot_table
,这样您就不会产生再次创建相同 DataFrame 的额外开销。如果您从类似数组的对象开始并且只关心透视数据,请使用 crosstab
。在大多数情况下,我认为您决定使用哪个功能不会真正产生影响。
pivot_table
中使用aggfunc=len
和fill_value=0
:
pd.crosstab(df['Col X'], df['Col Y'])
pd.pivot_table(df, index=['Col X'], columns=['Col Y'], aggfunc=len, fill_value=0)
编辑:还有更多区别:
默认
aggfunc
不同:pivot_table
- np.mean
、crosstab
- len
。
参数
margins_name
仅在pivot_table
中。
在
pivot_table
中,您可以使用 Grouper
来表示 index
和 columns
关键字。
我觉得如果你需要简单的频率表,
crosstab
功能更好。
不幸的是,
pivot_table
没有normalize
参数。
在
crosstab
中,normalize
参数通过将每个单元格除以单元格总和来计算百分比,如下所述:
normalize = 'index'
将每个单元格除以其行的总和normalize = 'columns'
将每个单元格除以其列的总和normalize = True
将每个单元格除以表格中所有单元格的总数数据透视表显示数据中的值。 交叉表代表数据的频率。
Crosstab 使用 count() 聚合来填充值,而ivot_table 将使用任何其他聚合,例如 sum()。