Python 为透视表中的每个值列定义aggfunc
正在尝试生成包含多个“值”列的透视表。我知道我可以使用aggfunc以我想要的方式聚合值,但如果我不想对两列求和或平均,而是希望一列求和,而另一列求平均值,该怎么办。那么,有没有可能用熊猫来做呢Python 为透视表中的每个值列定义aggfunc,python,python-2.7,pandas,Python,Python 2.7,Pandas,正在尝试生成包含多个“值”列的透视表。我知道我可以使用aggfunc以我想要的方式聚合值,但如果我不想对两列求和或平均,而是希望一列求和,而另一列求平均值,该怎么办。那么,有没有可能用熊猫来做呢 df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar'
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)
})
现在,这将得到一个包含sum的透视表:
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
的平均值
希望我的问题足够清楚。您可以合并两个数据帧:
>>> 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
>>> 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
或者您可以将函数列表作为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
当然,如果能为每一列单独定义aggfunc
,那就太好了。不知道怎么做,可能会被传递到aggfunc
dict-like参数,比如{'D':np.mean,'E':np.sum}
更新实际上,在您的情况下,您可以用手转动轴:
>>> 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
>>> 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
您可以通过传入dict将特定函数应用于特定列
pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean})
桌子
D E
平均和
A C
大型酒吧5.500000 7.500000
小型5.500000 8.500000
foo large 2.000000 4.500000
小号2.333333 4.333333
谢谢,两种方法都可以。然而,我希望得到的是一些单步的方式。正如您所说,我们能够为每个单独的列定义函数。“我会等待,如果其他人知道任何这样的方法,我会接受你的回答。”VIKASHJAISWAL见第三种方法,我认为这是你需要的。这正是我想要的,事实上这也适用于多列分组,df.groupby(['B','C']).aggregate({'D':np.sum,'E':np.mean})。谢谢你的努力。回答得很好。与有标记的答案相比优雅。我同意这个答案。但是,在pandas的最新版本中,关键字参数行已替换为索引。运行
pd.pivot_表(df,value=['D','E'],index=['B'],aggfunc={'D':np.sum,'E':np.mean})
。