Мне удалось добиться желаемого результата, например:
from collections import Counter
import pandas as pd
df = pd.DataFrame({'A':[500,500,300,400,400,300],'B':[10,10,20,10,20,30]})
inp = df.groupby('A')['B'].agg(Counter).to_frame()
out = pd.DataFrame.from_records(inp['B'].tolist(), index=inp.index).fillna(0).T
выход:
A 300 400 500
20 1.0 1.0 0.0
30 1.0 0.0 0.0
10 0.0 1.0 2.0
groupyby / Counter подсчитывает, сколько вхождений значений в B встречается в каждом значении на втором шаге распаковывает столбец словарей в фрейм данных