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.
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
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})
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