Таблицы частот в пандах (как plyr в R)

Моя проблема заключается в том, как рассчитать частоты для нескольких переменных в пандах. У меня есть из этого dataframe:

d1 = pd.DataFrame( {'StudentID': ["x1", "x10", "x2","x3", "x4", "x5", "x6",   "x7",     "x8", "x9"],
                       'StudentGender' : ['F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'],
                 'ExamenYear': ['2007','2007','2007','2008','2008','2008','2008','2009','2009','2009'],
                 'Exam': ['algebra', 'stats', 'bio', 'algebra', 'algebra', 'stats', 'stats', 'algebra', 'bio', 'bio'],
                 'Participated': ['no','yes','yes','yes','no','yes','yes','yes','yes','yes'],
                  'Passed': ['no','yes','yes','yes','no','yes','yes','yes','no','yes']},
                  columns = ['StudentID', 'StudentGender', 'ExamenYear', 'Exam', 'Participated', 'Passed'])

К следующему результату

             Participated  OfWhichpassed
 ExamenYear                             
2007                   3              2
2008                   4              3
2009                   3              2

(1) Одна из возможностей, которую я пробовал, - это вычислить два кадра данных и связать их

t1 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Participated'], aggfunc = len)
t2 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Passed'], aggfunc = len)
tx = pd.concat([t1, t2] , axis = 1)

Res1 = tx['yes']

(2) Вторая возможность - использовать функцию агрегирования.

import collections
dg = d1.groupby('ExamenYear')
Res2 = dg.agg({'Participated': len,'Passed': lambda x : collections.Counter(x == 'yes')[True]})

 Res2.columns = ['Participated', 'OfWhichpassed']

Оба способа неудобны, если не сказать больше.Как это правильно сделать в пандах?

П.С .: Я тоже пробовалvalue_counts вместоcollections.Counter но не мог заставить его работать

Для справки: несколько месяцев назад я задавал аналогичный вопрос для RВот а такжеplyr мог бы помочь

---- ОБНОВИТЬ ------

пользовательDSM правильно. в желаемом результате таблицы произошла ошибка.

(1) Код для первого варианта

 t1 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], aggfunc = len)
 t2 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Participated'], aggfunc = len)
 t3 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Passed'], aggfunc = len)

 Res1 = pd.DataFrame( {'All': t1,
                       'OfWhichParticipated': t2['yes'],
                     'OfWhichPassed': t3['yes']})

Это даст результат

             All  OfWhichParticipated  OfWhichPassed
ExamenYear                                         
2007          3                    2              2
2008          4                    3              3
2009          3                    3              2

(2) Для варианта 2, спасибо пользователюherrfzЯ разобрался как использовать value_count и код будет

Res2 = d1.groupby('ExamenYear').agg({'StudentID': len,
                                 'Participated': lambda x: x.value_counts()['yes'],
                                 'Passed': lambda x: x.value_counts()['yes']})

Res2.columns = ['All', 'OfWgichParticipated', 'OfWhichPassed']

который даст тот же результат, что и Res1

Мой вопрос остается, хотя:

Используя вариант 2, можно ли будет использовать одну и ту же переменную дважды (для другой операции?), Можно ли передать произвольное имя для результирующей переменной?

---- НОВОЕ ОБНОВЛЕНИЕ ----

Я наконец решил использоватьприменять который я понимаю, является более гибким.

Ответы на вопрос(4)

Ваш ответ на вопрос