【发布时间】:2014-01-03 14:21:13
【问题描述】:
我有一个数据集,其中包含 3 只动物的喂养数据,包括动物的标签 ID (1,2,3)、每顿饭的饲料类型 (A,B) 和数量 (kg) ':
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
在base R中,我可以很容易地输出下面的矩阵,下面的矩阵有unique('Animal')作为它的行,unique('FeedType')作为它的列,并且使用tapply()在矩阵的相应单元格中累积Amount (kg)如下
out <- with(mydf, tapply(Amount, list(Animal, FeedType), sum))
A B
Animal1 10 5
Animal2 2 13
Animal3 6 NA
Python Pandas 数据框是否有等效功能?在 Pandas 中实现这一目标的最优雅和最快的方法是什么?
附:我希望能够指定在哪个列(在本例中为 Amount)执行聚合。
提前致谢。
编辑:
我在两个答案中都尝试了这两种方法。我的 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() 工作得更快。
【问题讨论】: