Если я правильно понимаю, что вы хотите сгруппировать по столбцу _a, подсчитайте количество уникальных значений в столбце _b в каждой группе, а затем добавьте этот счетчик к исходному кадру данных, используя _a в качестве ключа.Следующий код должен достичь этого.
df.merge(pd.DataFrame(df.groupby('_a')._b.nunique()), left_on='_a', right_index=True)
Если разбить его, сначала нужно сгруппировать по _a, а затем сосчитать уникальные значения в столбце _b.Вот что делает df.groupby('_a')._b.nunique()
.Затем он объединяется с исходным кадром данных с использованием _a в качестве ключа.Groupby возвращает серию, поэтому нам нужно преобразовать ее в кадр данных перед объединением, следовательно, ответ pd.DataFrame
.
EDIT
@ COLDSPEED выше гораздо эффективнее, чем этот.Чтобы дать представление о разнице в скорости, я запустил timeit, которое показывает увеличение скорости в 2 раза на этом небольшом кадре данных, на больших кадрах данных, вероятно, будет еще больше.
Использование слияния:
%timeit df.merge(pd.DataFrame(df.groupby('_a')._b.nunique()), left_on='_a', right_index=True)
1.43 ms ± 74.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Использование преобразования:
%timeit df.groupby('_a')['_b'].transform('nunique')
750 µs ± 32 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)