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

15 numpy pivot-table crosstab scipy pandas

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

roo*_*oot 21

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

纵观源代码的crosstab,它本质上需要你通过阵列状物体,创建一个数据帧,然后调用pivot_table适当的.

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

  • 我对几个选项进行了计时,结果发现pivot_table比crosstab慢一个数量级,甚至比简单但笨重的groupby方法慢,[此处](/sf/ask/3605260221/进行分组以从整洁的熊猫数据帧生成汇总表) (2认同)
  • @Mpa 这没有任何意义。crosstab调用pivot_table,crosstab怎么会更快呢?交叉表增加了开销。本文显示 crosstab 是 groupby、pivot_table 和 crosstab 之间最慢的 https://ramiro.org/notebook/pandas-crosstab-groupby-pivot/ (2认同)

jez*_*ael 12

是否相同,如果在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)
Run Code Online (Sandbox Code Playgroud)

编辑:有更多的区别:

默认值aggfunc不同:pivot_table- np.mean,crosstab- len.

参数margins_name仅在pivot_table.

在pivot_table你可以Grouper用于index和columns关键字.


我想如果你只需要频率表,crosstab功能就更好了.


小智 11

不幸的是,pivot_table没有争论normalize。

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

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

  • 对我来说,这似乎是最臭名昭著的区别。我觉得很奇怪的是这个功能没有包含在`pivot_table`中。 (3认同)