尝试生成包含多个“值”列的数据透视表。我知道我可以使用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)
})
现在这将得到一个带有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
的意思?
希望我的问题足够明确。
答案 0 :(得分:52)
您可以通过传入词典将特定功能应用于特定列。
pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean})
答案 1 :(得分:21)
您可以连接两个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
答案 2 :(得分:0)
table = pivot_table(df, values=['D', 'E'], index=['A', 'C'],
aggfunc={'D': np.mean,'E': np.sum})
表 E 平均数 A C 酒吧大5.500000 7.500000 小5.500000 8.500000 foo大2.000000 4.500000 小2.333333 4.333333