У меня есть набор данных, который содержит данные о кормлении 3 животных, состоящие из идентификаторов тегов животных (1,2,3), типа (A, B) и количества (кг) корма, даваемого при каждом «приеме пищи»:
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 я могу легко вывести матрицу ниже, которая имеет 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?
P.S. Я хочу иметь возможность указать, в каком столбце, в данном случае 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() работает быстрее.