我有一个数据集,其中包含 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() 工作得更快。
最佳答案
首先我读入了你的数据:
In [7]: df = pd.read_clipboard(sep="\s+", index_col=False)
In [8]: df
Out[8]:
Animal FeedType Amount(kg)
0 Animal1 A 10
1 Animal2 B 7
2 Animal3 A 4
3 Animal2 A 2
4 Animal1 B 5
5 Animal2 B 6
6 Animal3 A 2
然后我可以对两列进行分组来聚合:
In [9]: df.groupby(['Animal','FeedType']).sum()
Out[9]:
Amount(kg)
Animal FeedType
Animal1 A 10
B 5
Animal2 A 2
B 13
Animal3 A 6
要以相同的格式获取它,我可以unstack
dataframe
:
In [10]: df.groupby(['Animal','FeedType']).sum().unstack()
Out[10]:
Amount(kg)
FeedType A B
Animal
Animal1 10 5
Animal2 2 13
Animal3 6 NaN
关于python - Python Pandas 中 R 的 tapply() 的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20905713/