動物のタグ ID (1,2,3)、タイプ (A,B)、および各「食事」で与えられる飼料の量 (kg) で構成される、3 匹の動物の給餌データを含むデータセットがあります。
Animal FeedType Amount(kg)
Animal1 A 10
Animal2 B 7
Animal3 A 4
Animal2 A 2
Animal1 B 5
Animal2 B 6
Animal3 A 2
unique('Animal')
ベースRでは、以下を使用して、行、列、および行列の対応するセルのunique('FeedType')
累積を持つ以下の行列を簡単に出力できますAmount (kg)
tapply()
out <- with(mydf, tapply(Amount, list(Animal, FeedType), sum))
A B
Animal1 10 5
Animal2 2 13
Animal3 6 NA
Python Pandas データフレームに同等の機能はありますか? パンダでこれを達成するための最もエレガントで最速の方法は何ですか?
Amount
PS どの列、この場合は、集計を実行するかを指定できるようにしたいと考えています。
前もって感謝します。
編集:
2つの回答で両方のアプローチを試しました。216,347 行 15 列の実際の Pandas データ フレームでのパフォーマンス結果:
start_time1 = timeit.default_timer()
mydf.groupby(['Animal','FeedType'])['Amount'].sum()
elapsed_groupby = timeit.default_timer() - start_time1
start_time2 = timeit.default_timer()
mydf.pivot_table(rows='Animal', cols='FeedType',values='Amount',aggfunc='sum')
elapsed_pivot = timeit.default_timer() - start_time2
print ('elapsed_groupby: ' + str(elapsed_groupby))
print ('elapsed_pivot: ' + str(elapsed_pivot))
与えます:
elapsed_groupby: 10.172213
elapsed_pivot: 8.465783
したがって、私の場合、pivot_table() の方が高速に動作します。