2013-11-21 4 views
15

複数の「値」列を持つピボットテーブルを生成しようとしていました。私はaggfuncを使用して値を集計する方法を知っていますが、もし両方の列を合計したいのではなく、一方の列の合計を他の列の平均値としたい場合はどうしますか?それで、パンダを使ってそうすることは可能ですか?平均ためパンダのピボットテーブルの各値列に対してaggfuncを定義

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

そして、この:

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

さて、これは合計で、ピボットテーブルを取得します

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

はどのようDのために合計し、Eのために意味得ることができますか?

私の質問は十分明確です。

答えて

19

することはでき2連結データフレーム

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

または機能aggfuncパラメータとして、その後、再インデックスのことができますパスリスト:

>>> 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が、持っていいだろうそれぞれの列に個別にaggfuncを定義するオプション。どのように実行できるかわからない場合は、{'D':np.mean, 'E':np.sum}のように、aggfunc dict-likeパラメータに渡すことができます。

更新実際には、あなたのケースでは、あなたはピボット手ですることができます

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

ありがとうございます、両方の方法が有効です。しかし私が得ることを望んでいたものは、いくつかの一歩一歩でした。あなたは、個々の列ごとに関数を定義できると言っていました。他の誰かがそのようなことを知っていれば私は待っています。私はあなたの答えをしばらくのうちに受け入れます。 –

+0

@VIKASHJAISWAL第3の方法を参照してください、私はこれがあなたが必要なものだと思います –

+0

優れています。正確に私が探していたものは、実際には複数の列でグループ化するために機能します。df.groupby(['B'、 'C​​'])集計({'D':np.sum、 'E':np。平均})。お疲れ様でした。 –

40

あなたは辞書に渡すことで、特定の列に特定の機能を適用することができます。

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

非常に良い答え。マークされた答えに比べてエレガントです。 – whytheq

関連する問題