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