我有一个数据集,包含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
在R语言中,我可以轻松地使用tapply()
函数输出以下矩阵,其中矩阵的行是unique('Animal')
,列是unique('FeedType')
,矩阵相应单元格内的累计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
)执行聚合。
提前感谢。
编辑:
我尝试了两个答案中的方法。在我的实际Pandas数据帧(216,347行,15列)中测试性能结果:
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()更快。
df.groupby(['Animal','FeedType']).sum()
来特别求和'Amount'
?我在同一数据框中有其他浮点列,我只对'Amount'
值感兴趣。 - Zhubarbdf.groupby(['Animal','FeedType'])['Amount'].sum()
。 - joris