ids = df.group.values
vals = df.value.values
m = np.isnan(vals)
grp_sums = np.bincount(ids, np.where(m, 0, vals))
avg_vals = grp_sums * (1.0 / np.bincount(ids, ~m))
vals[m] = avg_vals[ids[m]]
Pandas: заполнить пропущенные значения средним значением в каждой группе быстрее, чем преобразование