Как создать новый столбец с количеством по результатам группировки и суммирования других столбцов?

Дан df:

a = pd.DataFrame([{'id': 1, 'b': 2, 'c': "AA"},
                  {'id': 1, 'b': 2, 'c': "BB"},
                  {'id': 1, 'b': 4, 'c': 'AA'},
                  {'id': 1, 'b': 5, 'c': "BB"},
                  {'id': 1, 'b': 2, 'c': 'AA'},
                  {'id': 2, 'b': 3, 'c': "BB"},
                  {'id': 2, 'b': 2, 'c': "BB"},
                  {'id': 2, 'b': 2, 'c': 'AA'},
                  {'id': 3, 'b': 2, 'c': 'AA'},
                  {'id': 3, 'b': 2, 'c': "AA'},
                  {'id': 3, 'b': 5, 'c': "BB"},
                  {'id': 3, 'b': 2, 'c': "BB"}])

Как можно сгруппировать строки по значению id и по значению b, например равного 2, и посчитав количество значений из столбца c, равных "AA" и занести их в колонку d? То есть, должно получиться так:

    pd.DataFrame([{'id': 1, 'b': 2, 'c': "AA", 'd': 2},
                  {'id': 1, 'b': 2, 'c': "BB", 'd': 2},
                  {'id': 1, 'b': 4, 'c': "AA", 'd': 2},
                  {'id': 1, 'b': 5, 'c': "BB", 'd': 2},
                  {'id': 1, 'b': 2, 'c': "AA", 'd': 2},
                  {'id': 2, 'b': 3, 'c': "BB", 'd': 1},
                  {'id': 2, 'b': 2, 'c': "BB", 'd': 1},
                  {'id': 2, 'b': 2, 'c': "AA", 'd': 1},
                  {'id': 3, 'b': 2, 'c': "AA", 'd': 2},
                  {'id': 3, 'b': 2, 'c': "AA", 'd': 2},
                  {'id': 3, 'b': 5, 'c': "BB", 'd': 2},
                  {'id': 3, 'b': 2, 'c': "BB", 'd': 2}])

Ответы (1 шт):

Автор решения: MaxU
res = a.merge(
    a.query("b == 2 and c == 'AA'").groupby("id").size().reset_index(name="d"), 
    how="left")

результат:

In [371]: res
Out[371]:
    id  b   c  d
0    1  2  AA  2
1    1  2  BB  2
2    1  4  AA  2
3    1  5  BB  2
4    1  2  AA  2
5    2  3  BB  1
6    2  2  BB  1
7    2  2  AA  1
8    3  2  AA  2
9    3  2  AA  2
10   3  5  BB  2
11   3  2  BB  2
→ Ссылка