Pandas 交叉表与 Pandas 数据透视表有何不同?

问题描述 投票:0回答:5

pandas 的

crosstab
pivot_table
函数似乎都提供完全相同的功能。有什么不同吗?

pandas pivot-table
5个回答
51
投票

两者之间的主要区别是

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

查看 crosstab

源代码
,它本质上采用您传递的类似数组的对象,创建一个 DataFrame,然后根据需要调用
pivot_table

一般来说,如果您已经有一个 DataFrame,请使用

pivot_table
,这样您就不会产生再次创建相同 DataFrame 的额外开销。如果您从类似数组的对象开始并且只关心透视数据,请使用
crosstab
。在大多数情况下,我认为您决定使用哪个功能不会真正产生影响。


26
投票

是否一样,如果在

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
功能更好。


11
投票

不幸的是,

pivot_table
没有
normalize
参数。

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

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

1
投票

数据透视表显示数据中的值。 交叉表代表数据的频率。


0
投票

Crosstab 使用 count() 聚合来填充值,而ivot_table 将使用任何其他聚合,例如 sum()。

© www.soinside.com 2019 - 2024. All rights reserved.