web-dev-qa-db-fra.com

définir aggfunc pour chaque colonne de valeurs dans le tableau croisé dynamique des pandas

J'essayais de générer un tableau croisé dynamique avec plusieurs colonnes de "valeurs". Je sais que je peux utiliser aggfunc pour agréger les valeurs comme je le souhaite, mais que se passe-t-il si je ne veux pas additionner ou additionner les deux colonnes, mais plutôt que je veux additionner une colonne en moyenne Alors, est-il possible de le faire avec des 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 va donner un tableau croisé dynamique avec sum:

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

Et ceci pour moyen:

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

Comment obtenir une somme pour D et une moyenne pour E?

J'espère que ma question est assez claire.

18
VIKASH JAISWAL

Vous pouvez concaténer 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 la liste des fonctions comme paramètre aggfunc puis 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 définir aggfunc pour chaque colonne individuellement. Je ne sais pas comment cela pourrait être fait, peut être passé dans un paramètre de type aggfunc, comme {'D':np.mean, 'E':np.sum}.

update En fait, dans votre cas, vous pouvez faire pivoter à la 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
Roman Pekar

Vous pouvez appliquer une fonction spécifique à une colonne spécifique en transmettant un dict.

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean})
50
DataSwede
table = pivot_table(df, values=['D', 'E'], index=['A', 'C'],
                aggfunc={'D': np.mean,'E': np.sum})

tableau DE somme moyenne AC bar grande 5.500000 7.500000 petite 5,500000 8,500000 très grande 2.000000 4.500000 petit 2.333333 4.333333

0
user10987461