python - Python Pandas 中 R 的 tapply() 的等价物

标签 python r pandas tapply

我有一个数据集,其中包含 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/

相关文章:

python - 调用 strip() 后将 split() 转换为 dict()

R 安装包 RevoScaleR

r - 条形图中的颜色

python - DataFrame 在日期范围内重新采样

python - 根据 Pandas groupby() 结果删除行

python - 在日期之间更改 Pandas 系列中的值

python - 如何同时检查串行输入和键盘输入(同时使用readchar和串行库)

python - Python是否有解决使用递归关系定义的序列的包?

python-social-auth 和 github,我有这个错误 "The redirect_uri MUST match the registered callback URL for this application"

R openxlsx 包。把NA写成空格?