Pandas交叉表与Pandas pivot_table有何不同?

时间:2016-03-28 17:44:46

标签: pandas numpy scipy pivot-table crosstab

pandas.crosstab和Pandas pivot表似乎都提供了完全相同的功能。有什么不同吗?

3 个答案:

答案 0 :(得分:19)

两者之间的主要区别是pivot_table期望您的输入数据已经是DataFrame;您将DataFrame传递给pivot_table并通过将列名称作为字符串传递来指定index / columns / values。使用cross_tab时,您不一定需要输入DataFrame,因为您只需为index / columns / values传递类似数组的对象。

查看crosstab的{​​{3}},它主要采用您传递的类似数组的对象,创建一个DataFrame,然后根据需要调用pivot_table

通常,如果您已经拥有DataFrame,请使用pivot_table,这样您就不会再次创建相同的DataFrame。如果您从类似数组的对象开始并且只关注透视数据,请使用crosstab。在大多数情况下,我认为你决定使用哪种功能并不会产生任何影响。

答案 1 :(得分:10)

是否相同,如果在pivot_table中使用aggfunc=lenfill_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.meancrosstab - len

参数margins_name仅在pivot_table

pivot_table中,您可以Grouper使用indexcolumns个关键字。

我认为如果你只需要频率表,crosstab函数会更好。

答案 2 :(得分:1)

不幸的是,pivot_table没有normalize参数。

crosstab中,normalize参数通过将每个单元格除以单元格总和来计算百分比,如下所述:

  • normalize = 'index'将每个单元格除以其行之和
  • normalize = 'columns'将每个单元格除以其列的总和
  • normalize = True将每个单元格除以表格中所有单元格的总数