为熊猫数据透视表中的每个值列定义 aggfunc

Posted

技术标签:

【中文标题】为熊猫数据透视表中的每个值列定义 aggfunc【英文标题】:define aggfunc for each values column in pandas pivot table 【发布时间】:2013-12-05 19:56:59 【问题描述】:

试图生成一个包含多个“值”列的数据透视表。我知道我可以使用 aggfunc 以我想要的方式聚合值,但是如果我不想对两列求和或求平均值,而是想要一列的总和而另一列的平均值。那么使用 pandas 可以做到这一点吗?

df = pd.DataFrame(
          'A' : ['one', 'one', 'two', 'three'] * 6,
          'B' : ['A', 'B', 'C'] * 8,
          'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4,
          'D' : np.random.randn(24),
          'E' : np.random.randn(24)
)

现在这将得到一个带有总和的数据透视表:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum)

这意味着:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean)

如何获得D 的总和以及E 的平均值?

希望我的问题足够清楚。

【问题讨论】:

【参考方案1】:

您可以通过传入 dict 将特定函数应用于特定列。

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc='D':np.sum, 'E':np.mean)

【讨论】:

非常好的答案。与标记的答案相比,优雅。 我同意这个答案。但是,在最新版本的 pandas 中,关键字参数 rows 已替换为 index。运行 pd.pivot_table(df, values=['D','E'], index=['B'], aggfunc='D':np.sum, 'E':np.mean) 对我有用。【参考方案2】:

您可以连接两个 DataFrame

>>> df1 = pd.pivot_table(df, values=['D'], rows=['B'], aggfunc=np.sum)
>>> df2 = pd.pivot_table(df, values=['E'], rows=['B'], aggfunc=np.mean)
>>> pd.concat((df1, df2), axis=1)
          D         E
B                    
A  1.810847 -0.524178
B  2.762190 -0.443031
C  0.867519  0.078460

或者您可以将函数列表作为aggfunc参数传递,然后重新索引:

>>> df3 = pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=[np.sum, np.mean])
>>> df3
        sum                mean          
          D         E         D         E
B                                        
A  1.810847 -4.193425  0.226356 -0.524178
B  2.762190 -3.544245  0.345274 -0.443031
C  0.867519  0.627677  0.108440  0.078460
>>> df3 = df3.ix[:, [('sum', 'D'), ('mean','E')]]
>>> df3.columns = ['D', 'E']
>>> df3
          D         E
B                    
A  1.810847 -0.524178
B  2.762190 -0.443031
C  0.867519  0.078460

Alghouth,如果能够为每一列单独定义aggfunc,那就太好了。不知道怎么实现的,可以传入aggfunc类似dict的参数,比如'D':np.mean, 'E':np.sum

更新实际上,在您的情况下,您可以手动旋转

>>> df.groupby('B').aggregate('D':np.sum, 'E':np.mean)
          E         D
B                    
A -0.524178  1.810847
B -0.443031  2.762190
C  0.078460  0.867519

【讨论】:

谢谢,两种方法都行。但是我希望得到的是一些单步方法。正如您所说,能够为每个单独的列定义功能。如果其他人知道任何这样的方式,我会等待,否则我会在一段时间内接受你的答案。 @VIKASHJAISWAL 看第三种方法,我想这就是你需要的 优秀。正是我正在寻找的,事实上这也适用于按多列分组, df.groupby(['B','C']).aggregate('D':np.sum, 'E':np.意思是)。感谢您的努力。【参考方案3】:
table = pivot_table(df, values=['D', 'E'], index=['A', 'C'],
                aggfunc='D': np.mean,'E': np.sum)

表 德 平均数 交流电 大棒 5.500000 7.500000 小 5.500000 8.500000 富大 2.000000 4.500000 小 2.333333 4.333333

【讨论】:

以上是关于为熊猫数据透视表中的每个值列定义 aggfunc的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据透视表中的小计

如何删除熊猫数据透视表中的多级索引

熊猫:从数据透视表中的另一列中减去一列

如何合并熊猫数据透视表中的多索引层?

在没有聚合的熊猫数据透视表中重复条目并重命名列行

pandas 数据透视表:通过 aggfunc 计算加权平均值