我有一个数据集,其中包含 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')
列和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 数据框是否有等效功能?在 Pandas 中实现这一目标的最优雅和最快的方法是什么?
PS我希望能够指定在什么列上,在这种情况下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() 工作得更快。