首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`pd.pivot_table`和`pd.DataFrame.groupby` + `pd.DataFrame.unstack`之间是否完全重叠?

`pd.pivot_table`和`pd.DataFrame.groupby` + `pd.DataFrame.unstack`之间是否完全重叠?
EN

Stack Overflow用户
提问于 2016-09-24 09:40:47
回答 1查看 725关注 0票数 6

(请注意,有一个问题是Pandas: group by and Pivot table difference,但这个问题不同。)

假设您以DataFrame开头

代码语言:javascript
复制
df = pd.DataFrame({'a': ['x'] * 2 + ['y'] * 2, 'b': [0, 1, 0, 1], 'val': range(4)})
>>> df
Out[18]: 
   a  b  val
0  x  0    0
1  x  1    1
2  y  0    2
3  y  1    3

现在,假设您想要使索引a、列b、单元格val中的值,并指定如果结果单元格中有两个或多个值,应该做什么:

代码语言:javascript
复制
b  0  1
a      
x  0  1
y  2  3

然后你就可以通过

代码语言:javascript
复制
df.val.groupby([df.a, df.b]).sum().unstack()

或通过

代码语言:javascript
复制
pd.pivot_table(df, index='a', columns='b', values='val', aggfunc='sum')

因此,在我看来,两者之间似乎有一个简单的对应关系(给定一个,您几乎可以编写一个脚本来将其转换为另一个)。我还想到了具有分层索引/列的更复杂的情况,但我仍然认为没有区别。

我错过了什么吗?

  • 是否有可以使用其中一种而不是另一种执行的操作?
  • 也许,使用一个操作比另一个操作更容易执行吗?
  • 如果不是,为什么不反对pivot_tale呢?groupby似乎更通用。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-25 06:02:49

如果我正确地理解了pivot_table(index, columns, values, aggfunc)的源代码,那么它就相当于:

代码语言:javascript
复制
df.groupby([index + columns]).agg(aggfunc).unstack(columns)

+:

  • 利润率(小计和总计作为@ayhan has already said)
  • pivot_table()还从列轴中删除额外的多个级别(参见下面的示例)
  • 方便的dropna参数:不包括条目全部为NaN的列

演示:(我从pivot_table()的docstring源代码中获取这个DF )

代码语言:javascript
复制
In [40]: df
Out[40]:
     A    B      C  D
0  foo  one  small  1
1  foo  one  large  2
2  foo  one  large  2
3  foo  two  small  3
4  foo  two  small  3
5  bar  one  large  4
6  bar  one  small  5
7  bar  two  small  6
8  bar  two  large  7

In [41]: df.pivot_table(index=['A','B'], columns='C', values='D', aggfunc=[np.sum,np.mean])
Out[41]:
          sum        mean
C       large small large small
A   B
bar one   4.0   5.0   4.0   5.0
    two   7.0   6.0   7.0   6.0
foo one   4.0   1.0   2.0   1.0
    two   NaN   6.0   NaN   3.0

请注意顶层栏:D

代码语言:javascript
复制
In [42]: df.groupby(['A','B','C']).agg([np.sum, np.mean]).unstack('C')
Out[42]:
            D
          sum        mean
C       large small large small
A   B
bar one   4.0   5.0   4.0   5.0
    two   7.0   6.0   7.0   6.0
foo one   4.0   1.0   2.0   1.0
    two   NaN   6.0   NaN   3.0

为什么不反对pivot_tale?群比似乎要普遍得多。

因为它很容易使用,而且很方便!)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39674876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档