définir aggfunc pour chaque colonne de valeurs dans la table de pivotement pandas

essayait de générer une table de pivot avec plusieurs colonnes de "valeurs". Je sais que je peux utiliser aggfunc pour agréger les valeurs de la façon que je veux, mais que faire si Je ne veux pas faire la somme ou la moyenne des deux colonnes, mais à la place je veux la somme d'une colonne tandis que la moyenne de l'autre. Est-il possible de le faire avec 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)
})

Maintenant, cela permettra d'obtenir un tableau croisé dynamique avec somme:

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

et ceci pour la moyenne:

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

Comment puis-je obtenir la somme de D et la moyenne, pour <!--4?

j'Espère que ma question est assez claire.

18
demandé sur Dmitry B. 2013-11-21 15:14:46

2 réponses

Vous pouvez concat deux DataFrames:

>>> 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

ou vous pouvez passer liste des fonctionsaggfunc paramètres et ensuite ré-indexer:

>>> 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, il serait bien d'avoir une option pour defin aggfunc pour chaque colonne individuellement. Ne sais pas comment il pourrait être fait, peut-être passer dans aggfunc paramètre de type dict, comme {'D':np.mean, 'E':np.sum}.

mise à jour en Fait, dans votre cas, vous pouvez pivot par main:

>>> 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
21
répondu Roman Pekar 2013-11-21 13:18:17

Vous pouvez appliquer une fonction spécifique à une colonne spécifique en passant par dict.

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean})
48
répondu DataSwede 2014-07-02 23:13:24