pandas.crosstab和Pandas pivot表似乎都提供了完全相同的功能。有什么不同吗?
答案 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=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
函数会更好。
答案 2 :(得分:1)
不幸的是,pivot_table
没有normalize
参数。
在crosstab
中,normalize
参数通过将每个单元格除以单元格总和来计算百分比,如下所述:
normalize = 'index'
将每个单元格除以其行之和normalize = 'columns'
将每个单元格除以其列的总和normalize = True
将每个单元格除以表格中所有单元格的总数