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

VIK*_*WAL 20 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', 'bar', 'bar'] * 4,
          'D' : np.random.randn(24),
          'E' : np.random.randn(24)
})
Run Code Online (Sandbox Code Playgroud)

现在这将获得一个带有sum的数据透视表:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum)
Run Code Online (Sandbox Code Playgroud)

这意味着:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean)
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到和的D意思E

希望我的问题很清楚.

Dat*_*ede 54

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

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean})
Run Code Online (Sandbox Code Playgroud)

  • 非常好的答案.与明确的答案相比,优雅. (6认同)
  • 我同意这个答案。然而,在最新版本的 pandas 中,关键字参数 rows 已被索引取代。运行 `pd.pivot_table(df, value=['D','E'], index=['B'], aggfunc={'D':np.sum, 'E':np.mean})` 有效为我。 (3认同)

Rom*_*kar 22

您可以连接两个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
Run Code Online (Sandbox Code Playgroud)

或者您可以将函数列表作为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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)