2013-11-21 21 views
15

Birden çok "değer" sütununa sahip bir pivot tablo oluşturmaya çalışıyordu. Değerlerimi istediğim şekilde toplamak için aggfunc kullanabileceğimi biliyorum, ancak ne istersem iki sütunu da hesaba katmak istemiyorum ama bunun yerine bir sütunun toplamını istiyorum. Yani panda kullanarak bunu yapmak mümkün mü?pandas pivot tablosundaki her değerler sütunu için aggfunc tanımlayın.

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

nasıl D toplamını almak ve E için anlamına gelebilir:

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

Ve bu ortalama için:

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

Şimdi bu eksen toplamı ile tablo alacak? Umarım sorum yeterince açıktır.

cevap

19

yapabilirsiniz iki concat 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 

veya fonksiyonlaraggfunc parametre olarak ve daha sonra tekrar dizine ait yapabilirsiniz geçişli listesi:

>>> 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, olması güzel olurdu Her sütun için ayrı ayrı aggfunc tanımına bir seçenek. Bunun nasıl yapılacağını bilmiyorum, {'D':np.mean, 'E':np.sum} gibi dict benzeri bir parametreye geçiş olabilir.

güncelleme Aslında sizin durumunuzda elle tarafından Pivot edebilirsiniz:

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

Teşekkürler, her iki yol da işe yarar. Ancak ne elde etmeyi umduğum tek bir adımdı. Her bir sütun için işlevi tanımlayabileceğinizi söylediniz. Başka kimsenin böyle bir şeyden haberi olup olmadığını bekleyeceğim, bir süreliğine senin cevabını kabul edeceğim. –

+0

@VIKASHJAISWAL üçüncü yönteme bakın, bence ihtiyacınız olan şey budur –

+0

Mükemmel. Tam olarak aradığım şey, bu çalışmaların çoklu sütunlarla da gruplanması için de, df.groupby (['B', 'C']). anlamına gelmek}). Emeğin için teşekkürler. –

40

Bir dict geçirerek belirli bir sütuna belirli bir işlev uygulayabilirsiniz.

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean}) 
+3

Çok güzel cevap. İşaretli cevaba göre zarif. – whytheq

İlgili konular